FMUSER Wirless Trasmetti video e audio più facilmente!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> Afrikaans
sq.fmuser.org -> albanese
ar.fmuser.org -> Arabo
hy.fmuser.org -> Armenian
az.fmuser.org -> Azerbaigiano
eu.fmuser.org -> Basco
be.fmuser.org -> bielorusso
bg.fmuser.org -> Bulgaro
ca.fmuser.org -> Catalano
zh-CN.fmuser.org -> Cinese (semplificato)
zh-TW.fmuser.org -> Cinese (Tradizionale)
hr.fmuser.org -> croato
cs.fmuser.org -> ceco
da.fmuser.org -> danese
nl.fmuser.org -> Olandese
et.fmuser.org -> Estone
tl.fmuser.org -> Filippino
fi.fmuser.org -> finlandese
fr.fmuser.org -> Francese
gl.fmuser.org -> Galiziano
ka.fmuser.org -> georgiano
de.fmuser.org -> tedesco
el.fmuser.org -> Greca
ht.fmuser.org -> Creolo haitiano
iw.fmuser.org -> Ebraico
hi.fmuser.org -> Hindi
hu.fmuser.org -> Hungarian
is.fmuser.org -> Islandese
id.fmuser.org -> Indonesiano
ga.fmuser.org -> Irlandese
it.fmuser.org -> Italiano
ja.fmuser.org -> giapponese
ko.fmuser.org -> coreano
lv.fmuser.org -> Lettone
lt.fmuser.org -> Lithuanian
mk.fmuser.org -> Macedone
ms.fmuser.org -> Malese
mt.fmuser.org -> Maltese
no.fmuser.org -> Norwegian
fa.fmuser.org -> persiano
pl.fmuser.org -> polacco
pt.fmuser.org -> portoghese
ro.fmuser.org -> Romeno
ru.fmuser.org -> Russo
sr.fmuser.org -> Serbo
sk.fmuser.org -> slovacco
sl.fmuser.org -> Sloveno
es.fmuser.org -> spagnolo
sw.fmuser.org -> Swahili
sv.fmuser.org -> svedese
th.fmuser.org -> Thai
tr.fmuser.org -> turco
uk.fmuser.org -> Ucraino
ur.fmuser.org -> Urdu
vi.fmuser.org -> Vietnamita
cy.fmuser.org -> Gallese
yi.fmuser.org -> Yiddish
H264
La struttura di Nalu è Nalu, e la struttura di Nalu è nal head + rbsp. Il flusso di dati in trasmissione effettiva è mostrato in figura:
Ecco la descrizione dell'immagine
L'intestazione finale rappresenta un byte e i bit inferiori a 5 bit rappresentano il tipo finale, come mostrato nella tabella seguente:
tipo NAL | tipo na |
0 | non usato |
prima | Film non IDR |
seconda | Taglia i dati in una partizione |
tre | Slice partizione dati B |
quattro | Slice partizione dati C |
cinque | Il film di IDR imageDR |
sei | Nucleo Informativo Integrativo Miglioramento (SEI) |
Sette | Set di parametri di sequenza (SPS) |
otto | Set di parametri immagine (PPS) |
nove | Segno di demarcazione |
carnagione | Fine della sequenza |
undici | Fine del flusso |
dodici | riempire |
13 23 .. | conservare |
24 31 .. | Nessuna prenotazione |
RBSP è il caricamento della sequenza di byte originale.
Se il tipo finale è 5, il fotogramma è I fotogramma, cioè fotogramma chiave, e fotogramma non chiave (fotogramma P ...) quando il tipo è 1.
Nell'effettivo frame di dati H264, il tipo finale di frame è solitamente preceduto da un separatore 00, 001 o 00001. In generale, i primi dati del frame compilati dall'encoder sono PPS e SPS, seguiti dal frame I e quindi dal frame P
Push di streaming video Easypusher / easytmp
Easypusher e easytmp vengono utilizzati per ottenere il flusso video H264 e il flusso video audio in locale come sorgente video chiamando l'SDK della telecamera, estraendo il flusso RTSP, leggendo il file MP4, ecc. E quindi inviandoli al server multimediale di streaming da RTSP e RTMP. Sono tutti programmi push di streaming video che supportano Windows, Linux, Android, IOS, ARM e altre piattaforme.
Di seguito viene descritto come distinguono I frame e P frame dopo aver portato il flusso video in locale e quindi trasferiti:
// Questo codice legge i dati H264 dal file e li invia al server
char unsigned * ptr = nuovo char non firmato [sample_ size];
fread (ptr, sample_ size, 1, g_ fin);
// Scrivi un frame di dati - può essere inviato direttamente sulla rete
// fwrite (ptr, sample_ size, 1, fout);
EASY_ AV_ Frame avFrame;
memset (& avFrame, 0x00, sizeof (EASY_ AV_ Frame));
/*
* I primi 4 byte di PTR sono il carattere di divisione frame 0000001 e il quinto byte è di tipo nale
*/
unsigned char naltype = ((unsigned char) ptr [4] & 0x1F);
avFrame.pBuffer = (unsigned char *) ptr;
avFrame.u32AVFrameLen = dimensione_campione;
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);
Se la sorgente video non è un file, ma una telecamera IP o un flusso RTSP, potrebbero aver già informato il fotogramma corrente se il fotogramma corrente è un fotogramma I o un fotogramma P nella loro modulazione dello streaming video, quindi i passaggi per giudicare il nale tipo sono omessi.
HI_ S32 NETSDK_ APICALL OnStreamCallback (HI_ U32 u32handle, / * handle * /
HI_ U32 u32datatype, / * tipo di dati, dati video o audio o dati compositi audio video * /
HI_ U8 * pu8buffer, / * i dati contengono l'intestazione del frame * /
HI_ U32 u32length, / * lunghezza dati * /
HI_ Void * puserdata / * dati utente * /
)
{
HI_ S_ AVFrame * pstruAV = HI_ NULL;
HI_ S_ SysHeader * pstruSys = HI_ NULL;
se (u32DataType == HI_ NET_ DEV_ AV_ DATA)
{
pstruAV = (HI_ S_ AVFrame *) pu8Buffer;
if (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ VIDEO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) restituisce 0;
if (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 = (unsigned 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);
}
}
altro
if (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ AUDIO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) restituisce 0;
if (pstruAV-> u32AVFrameLen> 0)
{
// Telecamera IP diversa, l'intestazione dei dati è diversa qui e la dimensione corrispondente deve essere ignorata in base al loro SDK. Alcuni potrebbero non avere dati personalizzati
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; // Rimuove l'intestazione a 4 byte definita dal produttore
avFrame.pBuffer = (carattere senza segno *) pbuf + 4;
avFrame.u32AVFrameFlag = EASY_ SDK_ AUDIO_ FRAME_ FLAG;
avFrame.u32TimestampSec = pstruAV-> u32AVFramePTS / 1000;
avFrame.u32TimestampUsec = (pstruAV-> u32AVFramePTS% 1000) * 1000;
EasyPusher_ PushFrame (fPusherHandle, & avFrame);
}
}
}
altro
se (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);
}
ritorna HI_ SUCCESS;
}
Con l'origine dati, puoi eseguire il push di RTSP e RTMP in tempo reale chiamando libeasypusher o libeasyrtmp!
|
Inserisci l'email per ricevere una sorpresa
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> Afrikaans
sq.fmuser.org -> albanese
ar.fmuser.org -> Arabo
hy.fmuser.org -> Armenian
az.fmuser.org -> Azerbaigiano
eu.fmuser.org -> Basco
be.fmuser.org -> bielorusso
bg.fmuser.org -> Bulgaro
ca.fmuser.org -> Catalano
zh-CN.fmuser.org -> Cinese (semplificato)
zh-TW.fmuser.org -> Cinese (Tradizionale)
hr.fmuser.org -> croato
cs.fmuser.org -> ceco
da.fmuser.org -> danese
nl.fmuser.org -> Olandese
et.fmuser.org -> Estone
tl.fmuser.org -> Filippino
fi.fmuser.org -> finlandese
fr.fmuser.org -> Francese
gl.fmuser.org -> Galiziano
ka.fmuser.org -> georgiano
de.fmuser.org -> tedesco
el.fmuser.org -> Greca
ht.fmuser.org -> Creolo haitiano
iw.fmuser.org -> Ebraico
hi.fmuser.org -> Hindi
hu.fmuser.org -> Hungarian
is.fmuser.org -> Islandese
id.fmuser.org -> Indonesiano
ga.fmuser.org -> Irlandese
it.fmuser.org -> Italiano
ja.fmuser.org -> giapponese
ko.fmuser.org -> coreano
lv.fmuser.org -> Lettone
lt.fmuser.org -> Lithuanian
mk.fmuser.org -> Macedone
ms.fmuser.org -> Malese
mt.fmuser.org -> Maltese
no.fmuser.org -> Norwegian
fa.fmuser.org -> persiano
pl.fmuser.org -> polacco
pt.fmuser.org -> portoghese
ro.fmuser.org -> Romeno
ru.fmuser.org -> Russo
sr.fmuser.org -> Serbo
sk.fmuser.org -> slovacco
sl.fmuser.org -> Sloveno
es.fmuser.org -> spagnolo
sw.fmuser.org -> Swahili
sv.fmuser.org -> svedese
th.fmuser.org -> Thai
tr.fmuser.org -> turco
uk.fmuser.org -> Ucraino
ur.fmuser.org -> Urdu
vi.fmuser.org -> Vietnamita
cy.fmuser.org -> Gallese
yi.fmuser.org -> Yiddish
FMUSER Wirless Trasmetti video e audio più facilmente!
Contatti
Indirizzo:
No.305 Room HuiLan Building No.273 Huanpu Road Guangzhou Cina 510620
Categorie
Newsletter