FMUSER ¡Transmite video y audio sin cables más fácilmente!
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> Afrikáans
sq.fmuser.org -> albanés
ar.fmuser.org -> árabe
hy.fmuser.org -> Armenio
az.fmuser.org -> azerbaiyano
eu.fmuser.org -> Vasco
be.fmuser.org -> bielorruso
bg.fmuser.org -> Bulgaria
ca.fmuser.org -> catalán
zh-CN.fmuser.org -> chino (simplificado)
zh-TW.fmuser.org -> Chino (tradicional)
hr.fmuser.org -> croata
cs.fmuser.org -> checo
da.fmuser.org -> danés
nl.fmuser.org -> Holandés
et.fmuser.org -> estonio
tl.fmuser.org -> filipino
fi.fmuser.org -> finlandés
fr.fmuser.org -> Francés
gl.fmuser.org -> gallego
ka.fmuser.org -> georgiano
de.fmuser.org -> alemán
el.fmuser.org -> Griego
ht.fmuser.org -> criollo haitiano
iw.fmuser.org -> hebreo
hi.fmuser.org -> Hindi
hu.fmuser.org -> Hungarian
is.fmuser.org -> islandés
id.fmuser.org -> indonesio
ga.fmuser.org -> irlandés
it.fmuser.org -> Italiano
ja.fmuser.org -> japonés
ko.fmuser.org -> coreano
lv.fmuser.org -> letón
lt.fmuser.org -> Lituania
mk.fmuser.org -> macedonio
ms.fmuser.org -> malayo
mt.fmuser.org -> maltés
no.fmuser.org -> Noruega
fa.fmuser.org -> persa
pl.fmuser.org -> polaco
pt.fmuser.org -> portugués
ro.fmuser.org -> Rumano
ru.fmuser.org -> ruso
sr.fmuser.org -> serbio
sk.fmuser.org -> eslovaco
sl.fmuser.org -> Eslovenia
es.fmuser.org -> español
sw.fmuser.org -> Swahili
sv.fmuser.org -> sueco
th.fmuser.org -> Tailandés
tr.fmuser.org -> turco
uk.fmuser.org -> ucraniano
ur.fmuser.org -> Urdu
vi.fmuser.org -> Vietnamita
cy.fmuser.org -> galés
yi.fmuser.org -> Yiddish
H264
La estructura de Nalu es Nalu, y la estructura de Nalu es nal head + rbsp. El flujo de datos en la transmisión real se muestra en la figura:
Aquí está la descripción de la imagen
El encabezado final representa un byte y los 5 bits inferiores representan el tipo final, como se muestra en la siguiente tabla:
Tipo NAL | Tipo Nal |
0 | no utilizado |
una | Películas no IDR |
dos | Cortar datos en una partición |
Tres | Partición de datos de corte B |
Digital XNUMXk | Partición C de datos de corte |
Digital XNUMXk | La película de la imagen IDR |
seis | Unidad de información de mejora suplementaria (SEI) |
siete | Conjunto de parámetros de secuencia (SPS) |
ocho | Conjunto de parámetros de imagen (PPS) |
nueve | Marca de demarcación |
diez | Fin de secuencia |
once | El final del flujo |
doce | llenar |
13 23 .. | conservar |
24 31 .. | Sin reserva |
RBSP es la carga de secuencia de bytes original.
Si el tipo final es 5, el fotograma es I fotograma, es decir, fotograma clave, y no fotograma clave (fotograma P ...) cuando el tipo es 1.
En la trama de datos H264 real, el tipo final de la trama suele estar precedido por un separador 00, 001 o 00001. En términos generales, los datos de la primera trama compilados por el codificador son PPS y SPS, seguidos por la trama I y luego la trama P
Push de transmisión de video easypusher / easytmp
Easypusher y easytmp se utilizan para obtener la transmisión de video H264 y la transmisión de audio y video a local como fuente de video al llamar al SDK de la cámara, extraer la transmisión RTSP, leer el archivo MP4, etc., y luego enviarlos al servidor de medios de transmisión mediante RTSP y RTMP. Todos ellos son programas push de transmisión de video que admiten Windows, Linux, Android, IOS, arm y otras plataformas.
A continuación se describe cómo distinguen el fotograma I y el fotograma P después de obtener la transmisión de video a local y luego los empujan:
// Este código lee los datos H264 del archivo y los envía al servidor
unsigned char * ptr = new unsigned char [tamaño de muestra];
fread (ptr, tamaño de muestra, 1, g_ fin);
// Escribe un marco de datos: se puede enviar directamente a la red
// fwrite (ptr, tamaño_muestra, 1, fout);
EASY_ AV_ Frame avFrame;
memset (& avFrame, 0x00, tamaño de (EASY_ AV_ Frame));
/*
* Los primeros 4 bytes de PTR son el carácter de división de trama 0000001, y el quinto byte es el tipo nal
*/
unsigned char naltype = ((unsigned char) ptr [4] & 0x1F);
avFrame.pBuffer = (carácter sin firmar *) ptr;
avFrame.u32AVFrameLen = tamaño de muestra;
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 fuente de video no es un archivo, sino una cámara IP o una transmisión RTSP, es posible que ya hayan informado al cuadro actual si el cuadro actual es un cuadro I o un cuadro P en su modulación de transmisión de video, por lo que los pasos para juzgar el final tipo se omiten.
HI_ S32 NETSDK_ APICALL OnStreamCallback (HI_ U32 u32 mango, / * mango * /
HI_ U32 u32 tipo de datos, / * tipo de datos, datos de video o audio o datos compuestos de audio y video * /
HI_ U8 * pu8buffer, / * los datos contienen el encabezado del marco * /
HI_ U32 u32length, / * longitud de datos * /
HI_ Void * puserdata / * datos de usuario * /
)
{
HI_ S_ AVFrame * pstruAV = HI_ NULL;
HI_ S_ SysHeader * pstruSys = HI_ NULL;
si (u32DataType == HI_ NET_ DEV_ AV_ DATA)
{
pstruAV = (HI_ S_ AVFrame *) pu8Buffer;
si (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ VIDEO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) return 0;
si (pstruAV-> u32AVFrameLen> 0)
{
carácter sin firmar * pbuf = (carácter sin firmar *) (pu8Buffer + tamaño de (HI_ S_ AVFrame));
EASY_ AV_ Frame avFrame;
memset (& avFrame, 0x00, tamaño de (EASY_ AV_ Frame));
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen;
avFrame.pBuffer = (carácter sin firmar *) 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 y avFrame);
}
}
más
si (pstruAV-> u32AVFrameFlag == HI_ NET_ DEV_ AUDIO_ FRAME_ FLAG)
{
if (fPusherHandle == 0) return 0;
si (pstruAV-> u32AVFrameLen> 0)
{
// Cámara IP diferente, el encabezado de datos es diferente aquí, y el tamaño correspondiente debe omitirse de acuerdo con su SDK. Es posible que algunos no tengan datos personalizados
carácter sin firmar * pbuf = (carácter sin firmar *) (pu8Buffer + tamaño de (HI_ S_ AVFrame));
EASY_ AV_ Frame avFrame;
memset (& avFrame, 0x00, tamaño de (EASY_ AV_ Frame));
avFrame.u32AVFrameLen = pstruAV-> u32AVFrameLen-4; // Elimina el encabezado de 4 bytes definido por el fabricante
avFrame.pBuffer = (carácter sin firmar *) pbuf + 4;
avFrame.u32AVFrameFlag = EASY_ SDK_ AUDIO_ FRAME_ FLAG;
avFrame.u32TimestampSec = pstruAV-> u32AVFramePTS / 1000;
avFrame.u32TimestampUsec = (pstruAV-> u32AVFramePTS% 1000) * 1000;
EasyPusher_ PushFrame (fPusherHandle y avFrame);
}
}
}
más
si (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);
}
volver HI_ ÉXITO;
}
Con la fuente de datos, puede enviar RTSP y RTMP en vivo llamando a libeasypusher o libeasyrtmp.
|
Ingrese el correo electrónico para recibir una sorpresa
es.fmuser.org
it.fmuser.org
fr.fmuser.org
de.fmuser.org
af.fmuser.org -> Afrikáans
sq.fmuser.org -> albanés
ar.fmuser.org -> árabe
hy.fmuser.org -> Armenio
az.fmuser.org -> azerbaiyano
eu.fmuser.org -> Vasco
be.fmuser.org -> bielorruso
bg.fmuser.org -> Bulgaria
ca.fmuser.org -> catalán
zh-CN.fmuser.org -> chino (simplificado)
zh-TW.fmuser.org -> Chino (tradicional)
hr.fmuser.org -> croata
cs.fmuser.org -> checo
da.fmuser.org -> danés
nl.fmuser.org -> Holandés
et.fmuser.org -> estonio
tl.fmuser.org -> filipino
fi.fmuser.org -> finlandés
fr.fmuser.org -> Francés
gl.fmuser.org -> gallego
ka.fmuser.org -> georgiano
de.fmuser.org -> alemán
el.fmuser.org -> Griego
ht.fmuser.org -> criollo haitiano
iw.fmuser.org -> hebreo
hi.fmuser.org -> Hindi
hu.fmuser.org -> Hungarian
is.fmuser.org -> islandés
id.fmuser.org -> indonesio
ga.fmuser.org -> irlandés
it.fmuser.org -> Italiano
ja.fmuser.org -> japonés
ko.fmuser.org -> coreano
lv.fmuser.org -> letón
lt.fmuser.org -> Lituania
mk.fmuser.org -> macedonio
ms.fmuser.org -> malayo
mt.fmuser.org -> maltés
no.fmuser.org -> Noruega
fa.fmuser.org -> persa
pl.fmuser.org -> polaco
pt.fmuser.org -> portugués
ro.fmuser.org -> Rumano
ru.fmuser.org -> ruso
sr.fmuser.org -> serbio
sk.fmuser.org -> eslovaco
sl.fmuser.org -> Eslovenia
es.fmuser.org -> español
sw.fmuser.org -> Swahili
sv.fmuser.org -> sueco
th.fmuser.org -> Tailandés
tr.fmuser.org -> turco
uk.fmuser.org -> ucraniano
ur.fmuser.org -> Urdu
vi.fmuser.org -> Vietnamita
cy.fmuser.org -> galés
yi.fmuser.org -> Yiddish
FMUSER ¡Transmite video y audio sin cables más fácilmente!
Contacto
Dirección:
Habitación No.305 Edificio HuiLan No.273 Huanpu Road Guangzhou China 510620
Categorías
Newsletter