FMUSER Wirless transmet la vidéo et l'audio plus facilement!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> Afrikaans
sq.fmuser.org -> albanais
ar.fmuser.org -> arabe
hy.fmuser.org -> Armenian
az.fmuser.org -> azerbaïdjanais
eu.fmuser.org -> basque
be.fmuser.org -> biélorusse
bg.fmuser.org -> Bulgare
ca.fmuser.org -> catalan
zh-CN.fmuser.org -> chinois (simplifié)
zh-TW.fmuser.org -> Chinois (traditionnel)
hr.fmuser.org -> croate
cs.fmuser.org -> tchèque
da.fmuser.org -> danois
nl.fmuser.org -> Néerlandais
et.fmuser.org -> estonien
tl.fmuser.org -> Philippin
fi.fmuser.org -> finnois
fr.fmuser.org -> Français
gl.fmuser.org -> Galicien
ka.fmuser.org -> géorgien
de.fmuser.org -> allemand
el.fmuser.org -> Grec
ht.fmuser.org -> Créole haïtien
iw.fmuser.org -> hébreu
hi.fmuser.org -> Hindi
hu.fmuser.org -> Hongrois
is.fmuser.org -> islandais
id.fmuser.org -> indonésien
ga.fmuser.org -> irlandais
it.fmuser.org -> Italien
ja.fmuser.org -> japonais
ko.fmuser.org -> coréen
lv.fmuser.org -> letton
lt.fmuser.org -> Lituanien
mk.fmuser.org -> macédonien
ms.fmuser.org -> malais
mt.fmuser.org -> maltais
no.fmuser.org -> Norwegian
fa.fmuser.org -> persan
pl.fmuser.org -> polonais
pt.fmuser.org -> portugais
ro.fmuser.org -> Roumain
ru.fmuser.org -> russe
sr.fmuser.org -> serbe
sk.fmuser.org -> slovaque
sl.fmuser.org -> Slovène
es.fmuser.org -> espagnol
sw.fmuser.org -> Swahili
sv.fmuser.org -> suédois
th.fmuser.org -> Thai
tr.fmuser.org -> turc
uk.fmuser.org -> ukrainien
ur.fmuser.org -> ourdou
vi.fmuser.org -> Vietnamienne
cy.fmuser.org -> Gallois
yi.fmuser.org -> Yiddish
H264
La structure de Nalu est Nalu, et la structure de Nalu est nal head + rbsp. Le flux de données dans la transmission réelle est illustré dans la figure:
Voici la description de l'image
L'en-tête nal compte pour un octet et les 5 bits inférieurs représentent le type nal, comme indiqué dans le tableau suivant:
type NAL | Type de nal |
0 | non utilisé |
UN | Films non IDR |
deux | Trancher les données d'une partition |
trois | Trancher la partition de données B |
quatre | Trancher la partition de données C |
cinq | Le film de l'image IDR |
six | Unité d'information d'amélioration supplémentaire (SEI) |
sept | Jeu de paramètres de séquence (SPS) |
huit | Jeu de paramètres d'image (PPS) |
neuf | Marque de démarcation |
Dix | Fin de séquence |
onze | Fin du flux |
douze | remplir |
13 .. 23 | conserver |
24 .. 31 | Pas de réservation |
RBSP est la charge de séquence d'octets d'origine.
Si le type nal est 5, l'image est une image I, c'est-à-dire une image clé et une image non clé (image P ...) lorsque le type est 1.
Dans la trame de données H264 réelle, le type nal de la trame est généralement précédé d'un séparateur 00, 001 ou 00001. De manière générale, les premières données de trame compilées par le codeur sont PPS et SPS, suivies de la trame I, puis de la trame P
Poussée de diffusion vidéo Easypusher / easytmp
Easypusher et easytmp sont utilisés pour obtenir le flux vidéo H264 et le flux vidéo audio en local en tant que source vidéo en appelant le SDK de la caméra, en tirant le flux RTSP, en lisant le fichier MP4, etc., puis en les poussant vers le serveur multimédia en continu par RTSP et RTMP. Ce sont tous des programmes push de streaming vidéo qui prennent en charge Windows, Linux, Android, IOS, arm et d'autres plates-formes.
Ce qui suit décrit comment ils distinguent l'image I et l'image P après avoir obtenu le flux vidéo en local, puis les pousser:
// Ce code lit les données H264 du fichier et les pousse vers le serveur
unsigned char * ptr = nouveau caractère non signé [taille_échantillon];
fread (ptr, taille_échantillon, 1, g_ fin);
// Ecrire une trame de données - peut être poussé directement sur le réseau
// fwrite (ptr, taille_échantillon, 1, fout);
EASY_ AV_ Frame avFrame;
memset (& avFrame, 0x00, sizeof (EASY_ AV_ Frame));
/*
* Les 4 premiers octets de PTR sont le caractère de division de trame 0000001, et le cinquième octet est de type nal
*/
caractère non signé naltype = ((caractère non signé) ptr [4] & 0x1F);
avFrame.pBuffer = (caractère non signé *) ptr;
avFrame.u32AVFrameLen = taille_échantillon;
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);
Si la source vidéo n'est pas un fichier, mais un flux IPcamera ou RTSP, ils ont peut-être déjà informé la trame actuelle si la trame actuelle est une trame I ou une trame P dans leur modulation de retour de flux vidéo, donc les étapes pour juger le nal type sont omis.
HI_ S32 NETSDK_ APICALL OnStreamCallback (HI_ U32 u32handle, / * handle * /
HI_ U32 u32datatype, / * type de données, données vidéo ou audio ou données composites audio vidéo * /
HI_ U8 * pu8buffer, / * les données contiennent un en-tête de trame * /
HI_ U32 u32length, / * longueur des données * /
HI_ Void * puserdata / * données utilisateur * /
)
{
HI_ S_ AVFrame * pstruAV = HI_ NULL;
HI_ S_ SysHeader * pstruSys = HI_ NULL;
si (u32DataType == HI_ NET_ DEV_ AV_ DATA)
{
pstruAV = (HI_ S_ AVFrame *) pu8Buffer;
if (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ VIDEO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) renvoie 0;
si (pstruAV-> u32AVFrameLen> 0)
{
unsigned char * pbuf = (unsigned char *) (pu8Buffer + sizeof (HI_ S_ AVFrame));
EASY_ AV_ Frame avFrame;
memset (& avFrame, 0x00, sizeof (EASY_ AV_ Frame));
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen;
avFrame.pBuffer = (caractère non signé *) 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);
}
}
d'autre
si (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ AUDIO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) renvoie 0;
si (pstruAV-> u32AVFrameLen> 0)
{
// Différente IPcamera, l'en-tête de données est différent ici, et la taille correspondante doit être ignorée en fonction de leur SDK. Certains peuvent ne pas avoir de données personnalisées
unsigned char * pbuf = (unsigned char *) (pu8Buffer + sizeof (HI_ S_ AVFrame));
EASY_ AV_ Frame avFrame;
memset (& avFrame, 0x00, sizeof (EASY_ AV_ Frame));
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen-4; // Supprime l'en-tête de 4 octets défini par le fabricant
avFrame.pBuffer = (caractère non signé *) pbuf + 4;
avFrame.u32AVFrameFlag = EASY_ SDK_ AUDIO_ FRAME_ FLAG ;
avFrame.u32TimestampSec = pstruAV-> u32AVFramePTS / 1000;
avFrame.u32TimestampUsec = (pstruAV-> u32AVFramePTS% 1000) * 1000;
EasyPusher_ PushFrame (fPusherHandle, & avFrame);
}
}
}
d'autre
si (u32DataType == HI_ NET_ DEV_ SYS_ DATA)
{
pstruSys = (HI_ S_ SysHeader *) pu8Buffer;
printf ("Vidéo W:% u H:% u Audio:% u \ n", pstruSys-> struVHeader.u32Width, pstruSys-> struVHeader.u32Height, pstruSys-> struAHeader.u32Format);
}
renvoie HI_SUCCESS ;
}
Avec la source de données, vous pouvez pousser RTSP et RTMP en direct en appelant libeasypusher ou libeasyrtmp!
|
Entrez l'email pour avoir une surprise
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> Afrikaans
sq.fmuser.org -> albanais
ar.fmuser.org -> arabe
hy.fmuser.org -> Armenian
az.fmuser.org -> azerbaïdjanais
eu.fmuser.org -> basque
be.fmuser.org -> biélorusse
bg.fmuser.org -> Bulgare
ca.fmuser.org -> catalan
zh-CN.fmuser.org -> chinois (simplifié)
zh-TW.fmuser.org -> Chinois (traditionnel)
hr.fmuser.org -> croate
cs.fmuser.org -> tchèque
da.fmuser.org -> danois
nl.fmuser.org -> Néerlandais
et.fmuser.org -> estonien
tl.fmuser.org -> Philippin
fi.fmuser.org -> finnois
fr.fmuser.org -> Français
gl.fmuser.org -> Galicien
ka.fmuser.org -> géorgien
de.fmuser.org -> allemand
el.fmuser.org -> Grec
ht.fmuser.org -> Créole haïtien
iw.fmuser.org -> hébreu
hi.fmuser.org -> Hindi
hu.fmuser.org -> Hongrois
is.fmuser.org -> islandais
id.fmuser.org -> indonésien
ga.fmuser.org -> irlandais
it.fmuser.org -> Italien
ja.fmuser.org -> japonais
ko.fmuser.org -> coréen
lv.fmuser.org -> letton
lt.fmuser.org -> Lituanien
mk.fmuser.org -> macédonien
ms.fmuser.org -> malais
mt.fmuser.org -> maltais
no.fmuser.org -> Norwegian
fa.fmuser.org -> persan
pl.fmuser.org -> polonais
pt.fmuser.org -> portugais
ro.fmuser.org -> Roumain
ru.fmuser.org -> russe
sr.fmuser.org -> serbe
sk.fmuser.org -> slovaque
sl.fmuser.org -> Slovène
es.fmuser.org -> espagnol
sw.fmuser.org -> Swahili
sv.fmuser.org -> suédois
th.fmuser.org -> Thai
tr.fmuser.org -> turc
uk.fmuser.org -> ukrainien
ur.fmuser.org -> ourdou
vi.fmuser.org -> Vietnamienne
cy.fmuser.org -> Gallois
yi.fmuser.org -> Yiddish
FMUSER Wirless transmet la vidéo et l'audio plus facilement!
Contactez-nous
Adresse :
No.305 Chambre HuiLan Building No.273 Huanpu Road Guangzhou Chine 510620
Catégories
Newsletter