FMUSER Wirless ينقل الفيديو والصوت بشكل أسهل!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> الأفريكانية
sq.fmuser.org -> الألبانية
ar.fmuser.org -> عربي
hy.fmuser.org -> الأرمينية
az.fmuser.org -> الأذربيجانية
eu.fmuser.org -> الباسك
be.fmuser.org -> البيلاروسية
bg.fmuser.org -> البلغارية
ca.fmuser.org -> الكتالانية
zh-CN.fmuser.org -> الصينية (المبسطة)
zh-TW.fmuser.org -> الصينية (التقليدية)
hr.fmuser.org -> الكرواتية
cs.fmuser.org -> التشيكية
da.fmuser.org -> الدنماركية
nl.fmuser.org -> الهولندية
et.fmuser.org -> الإستونية
tl.fmuser.org -> فلبيني
fi.fmuser.org -> الفنلندية
fr.fmuser.org -> الفرنسية
gl.fmuser.org -> الجاليكية
ka.fmuser.org -> الجورجية
de.fmuser.org -> الألمانية
el.fmuser.org -> اليونانية
ht.fmuser.org -> الكريولية الهايتية
iw.fmuser.org -> عبري
hi.fmuser.org -> الهندية
hu.fmuser.org -> الهنغارية
is.fmuser.org -> الأيسلندية
id.fmuser.org -> الإندونيسية
ga.fmuser.org -> الأيرلندية
it.fmuser.org -> الإيطالية
ja.fmuser.org -> اليابانية
ko.fmuser.org -> كوري
lv.fmuser.org -> اللاتفية
lt.fmuser.org -> ليتوانيا
mk.fmuser.org -> المقدونية
ms.fmuser.org -> الملايو
mt.fmuser.org -> المالطية
no.fmuser.org -> النرويجية
fa.fmuser.org -> فارسي
pl.fmuser.org -> البولندية
pt.fmuser.org -> البرتغالية
ro.fmuser.org -> الرومانية
ru.fmuser.org -> الروسية
sr.fmuser.org -> الصربية
sk.fmuser.org -> السلوفاكية
sl.fmuser.org -> السلوفينية
es.fmuser.org -> الاسبانية
sw.fmuser.org -> السواحيلية
sv.fmuser.org -> السويدية
th.fmuser.org -> التايلاندية
tr.fmuser.org -> التركية
uk.fmuser.org -> الأوكرانية
ur.fmuser.org -> الأردية
vi.fmuser.org -> الفيتنامية
cy.fmuser.org -> الويلزية
yi.fmuser.org -> اليديشية
H264
هيكل Nalu هو Nalu ، وبنية Nalu هي nal head + rbsp. يظهر تدفق البيانات في الإرسال الفعلي في الشكل:
هنا وصف الصورة
يمثل رأس nal بايتًا واحدًا ، وتمثل البتات الخمسة السفلية النوع nal ، كما هو موضح في الجدول التالي:
نوع NAL | نوع نال |
0 | غير مستعمل |
صورة واحدة؟ | أفلام غير IDR |
اثنان | شريحة البيانات قسم |
ثلاثة | شريحة البيانات التقسيم ب |
أربعة | شريحة البيانات C التقسيم |
خمسة | فيلم IDR image |
ستة | وحدة معلومات التحسين التكميلي (SEI) |
سبعة | مجموعة معلمات التسلسل (SPS) |
ثمانية | مجموعة معلمات الصورة (PPS) |
تسعة | علامة الترسيم |
عشرة | نهاية التسلسل |
أحد عشر | نهاية الدفق |
اثنا عشر | شغل |
13 23 .. | احتفظ |
24 31 .. | أي تحفظ |
RBSP هو حمل تسلسل البايت الأصلي.
إذا كان النوع nal هو 5 ، فإن الإطار هو I frame ، أي keyframe ، و non key frame (P frame ...) عندما يكون type هو 1.
في إطار بيانات H264 الفعلي ، عادةً ما يسبق النوع n للإطار بفاصل 00 أو 001 أو 00001. بشكل عام ، فإن بيانات الإطار الأولى التي تم تجميعها بواسطة المشفر هي PPS و SPS ، متبوعة بالإطار I ، ثم الإطار P
دفع تدفق الفيديو Easypusher / easytmp
يتم استخدام Easypusher و easytmp للحصول على دفق الفيديو H264 ودفق الفيديو الصوتي إلى محلي كمصدر فيديو عن طريق استدعاء كاميرا SDK ، وسحب دفق RTSP ، وقراءة ملف MP4 ، وما إلى ذلك ، ثم دفعهم إلى خادم دفق الوسائط بواسطة RTSP و RTMP. كلها برامج دفع لبث الفيديو تدعم windows و Linux و Android و IOS والذراع والأنظمة الأساسية الأخرى.
فيما يلي وصف لكيفية التمييز بين الإطار I والإطار P بعد نقل دفق الفيديو إلى المستوى المحلي ، ثم دفعهما:
// هذا الكود يقرأ بيانات H264 من الملف ويدفعها إلى الخادم
char * ptr = char جديد غير موقعة [sample_ size] ؛
fread (ptr ، حجم العينة ، 1 ، g_ زعنفة) ؛
// كتابة إطار بيانات - يمكن دفعه مباشرة على الشبكة
// fwrite (ptr، sample_ size، 1، fout) ؛
EASY_ AV_ إطار متوسط ؛
memset (& avFrame، 0x00، sizeof (EASY_ AV_ Frame)) ؛
/*
* أول 4 بايتات من PTR هي رمز تقسيم الرتل 0000001 ، والبايت الخامس هو نوع nal
*/
غير موقعة char naltype = ((حرف غير موقعة) ptr [4] & 0x1F) ؛
avFrame.pBuffer = (حرف * بدون إشارة) ptr ؛
avFrame.u32AVFrameLen = حجم العينة ؛
avFrame.u32VFrameType = (naltype == 0x05)؟ EASY_ SDK_ VIDEO_ FRAME_ I: EASY_ SDK_ VIDEO_ FRAME_ P ؛
avFrame.u32AVFrameFlag = EASY_ SDK_ VIDEO_ FRAME_ FLAG ،
avFrame.u32TimestampSec = lTimeStamp / 1000000 ؛
avFrame.u32TimestampUsec = (lTimeStamp٪ 1000000) ،
إذا لم يكن مصدر الفيديو ملفًا ، ولكنه عبارة عن دفق IPcamera أو RTSP ، فقد يكونون قد أبلغوا بالفعل الإطار الحالي ما إذا كان الإطار الحالي هو إطار I أو إطار P في التعديل الخلفي لدفق الفيديو ، لذا فإن الخطوات للحكم على nal تم حذف النوع.
HI_ S32 NETSDK_ APICALL OnStreamCallback (HI_ U32 u32handle ، / * مقبض * /
HI_ U32 u32datatype ، / * نوع البيانات ، بيانات الفيديو أو الصوت أو بيانات الصوت والفيديو المركب * /
HI_ U8 * pu8buffer ، / * تحتوي البيانات على رأس إطار * /
HI_ U32 u32length ، / * طول البيانات * /
HI_ Void * puserdata / * بيانات المستخدم * /
)
{
HI_ S_ AVFrame * pstruAV = HI_ NULL ؛
HI_ S_ SysHeader * pstruSys = HI_ NULL ؛
إذا (u32DataType == HI_ NET_ DEV_ AV_ DATA)
{
pstruAV = (HI_ S_ AVFrame *) pu8Buffer ؛
إذا (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ VIDEO_ FRAME_ FLAG)
{
إذا (fPusherHandle == 0) إرجاع 0 ؛
إذا (pstruAV-> u32AVFrameLen> 0)
{
char * pbuf = (char *) غير الموقعة (pu8Buffer + sizeof (HI_ S_ AVFrame)) ؛
EASY_ AV_ إطار متوسط ؛
memset (& avFrame، 0x00، sizeof (EASY_ AV_ Frame)) ؛
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen ؛
avFrame.pBuffer = (char *) pbuf ؛
avFrame.u32VFrameType = (pstruAV-> u32VFrameType == HI_ NET_ DEV_ VIDEO_ FRAME_ I)؟ EASY_ SDK_ VIDEO_ FRAME_ I: EASY_ SDK_ VIDEO_ FRAME_ P ؛
avFrame.u32AVFrameFlag = EASY_ SDK_ VIDEO_ FRAME_ FLAG ،
avFrame.u32TimestampSec = pstruAV-> u32AVFramePTS / 1000 ؛
avFrame.u32TimestampUsec = (pstruAV-> u32AVFramePTS٪ 1000) * 1000 ؛
EasyPusher_ PushFrame (fPusherHandle ، & avFrame) ؛
}
}
آخر
إذا (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ AUDIO_ FRAME_ FLAG)
{
إذا (fPusherHandle == 0) إرجاع 0 ؛
إذا (pstruAV-> u32AVFrameLen> 0)
{
// IPcamera مختلفة ، يختلف رأس البيانات هنا ، ويجب تخطي الحجم المقابل وفقًا لـ SDK الخاص بهم. قد لا يكون لدى البعض بيانات مخصصة
char * pbuf = (char *) غير الموقعة (pu8Buffer + sizeof (HI_ S_ AVFrame)) ؛
EASY_ AV_ إطار متوسط ؛
memset (& avFrame، 0x00، sizeof (EASY_ AV_ Frame)) ؛
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen-4 ؛ // إزالة الرأس 4 بايت المحدد من قبل الشركة المصنعة
avFrame.pBuffer = (حرف غير موقعة *) pbuf + 4 ؛
avFrame.u32AVFrameFlag = EASY_ SDK_ AUDIO_ FRAME_ FLAG ،
avFrame.u32TimestampSec = pstruAV-> u32AVFramePTS / 1000 ؛
avFrame.u32TimestampUsec = (pstruAV-> u32AVFramePTS٪ 1000) * 1000 ؛
EasyPusher_ PushFrame (fPusherHandle ، & avFrame) ؛
}
}
}
آخر
إذا (u32DataType == HI_ NET_ DEV_ SYS_ DATA)
{
pstruSys = (HI_ S_ SysHeader *) pu8Buffer ؛
printf ("Video W:٪ u H:٪ u Audio:٪ u \ n"، pstruSys-> struVHeader.u32Width، pstruSys-> struVHeader.u32Height، pstruSys-> struAHeader.u32Format) ؛
}
عودة HI_ SUCCESS ؛
}
مع مصدر البيانات ، يمكنك دفع RTSP و RTMP مباشرة عن طريق استدعاء libeasypusher أو libeasyrtmp!
|
أدخل البريد الإلكتروني للحصول على مفاجأة
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> الأفريكانية
sq.fmuser.org -> الألبانية
ar.fmuser.org -> عربي
hy.fmuser.org -> الأرمينية
az.fmuser.org -> الأذربيجانية
eu.fmuser.org -> الباسك
be.fmuser.org -> البيلاروسية
bg.fmuser.org -> البلغارية
ca.fmuser.org -> الكتالانية
zh-CN.fmuser.org -> الصينية (المبسطة)
zh-TW.fmuser.org -> الصينية (التقليدية)
hr.fmuser.org -> الكرواتية
cs.fmuser.org -> التشيكية
da.fmuser.org -> الدنماركية
nl.fmuser.org -> الهولندية
et.fmuser.org -> الإستونية
tl.fmuser.org -> فلبيني
fi.fmuser.org -> الفنلندية
fr.fmuser.org -> الفرنسية
gl.fmuser.org -> الجاليكية
ka.fmuser.org -> الجورجية
de.fmuser.org -> الألمانية
el.fmuser.org -> اليونانية
ht.fmuser.org -> الكريولية الهايتية
iw.fmuser.org -> عبري
hi.fmuser.org -> الهندية
hu.fmuser.org -> الهنغارية
is.fmuser.org -> الأيسلندية
id.fmuser.org -> الإندونيسية
ga.fmuser.org -> الأيرلندية
it.fmuser.org -> الإيطالية
ja.fmuser.org -> اليابانية
ko.fmuser.org -> كوري
lv.fmuser.org -> اللاتفية
lt.fmuser.org -> ليتوانيا
mk.fmuser.org -> المقدونية
ms.fmuser.org -> الملايو
mt.fmuser.org -> المالطية
no.fmuser.org -> النرويجية
fa.fmuser.org -> فارسي
pl.fmuser.org -> البولندية
pt.fmuser.org -> البرتغالية
ro.fmuser.org -> الرومانية
ru.fmuser.org -> الروسية
sr.fmuser.org -> الصربية
sk.fmuser.org -> السلوفاكية
sl.fmuser.org -> السلوفينية
es.fmuser.org -> الاسبانية
sw.fmuser.org -> السواحيلية
sv.fmuser.org -> السويدية
th.fmuser.org -> التايلاندية
tr.fmuser.org -> التركية
uk.fmuser.org -> الأوكرانية
ur.fmuser.org -> الأردية
vi.fmuser.org -> الفيتنامية
cy.fmuser.org -> الويلزية
yi.fmuser.org -> اليديشية
FMUSER Wirless ينقل الفيديو والصوت بشكل أسهل!
اتصل بنا
العنوان
No.305 غرفة HuiLan مبنى رقم 273 Huanpu Road قوانغتشو الصين 510620
الفئات
بريدك الإلكتروني