Como multicast ao vivo H264 sem transcodificação?

1

Eu tenho um fluxo H264 ao vivo (hardware codificado da webcam) e gostaria de transmiti-lo pela rede usando multicast em uma plataforma Linux.

Como a plataforma tem poder de CPU limitado e os dados da câmera já estão no formato H264, não quero transcodificar o fluxo - basta transmiti-lo como está, talvez com envolvimento adicional em qualquer contêiner de transporte necessário .

Eu tentei isso:

ffmpeg -f v4l2 -video_size hd720 -framerate 30 -input_format h264 -i /dev/video0 -vcodec copy -an -f rtp rtp://224.0.1.2:5001

O que parece ser o multicast dos dados, mas quando vou tocar o stream, recebo vários erros:

[h264 @ 0x7feffc064400]non-existing PPS 0 referenced
[h264 @ 0x7feffc064400]non-existing PPS 0 referenced
[h264 @ 0x7feffc064400]decode_slice_header error
[h264 @ 0x7feffc064400]no frame!
[h264 @ 0x7feffc064400]non-existing PPS 0 referenced
[h264 @ 0x7feffc064400]non-existing PPS 0 referenced
[h264 @ 0x7feffc064400]decode_slice_header error
[h264 @ 0x7feffc064400]no frame!

Por que isso não funciona? Como você deve multicastar um fluxo de dados H264 brutos?

EDIT: Como solicitado, quando eu executo o comando ffmpeg acima, isso é o que é produzido:

ffmpeg version 2.4.2 Copyright (c) 2000-2014 the FFmpeg developers
  built on Oct 15 2014 06:19:14 with gcc 4.8.2 (GCC) 20131219 (prerelease)
  configuration: --prefix=/usr --disable-debug --disable-static --enable-avisynth --enable-avresample --enable-decoder=atrac3 --enable-decoder=atrac3p --enable-dxva2 --enable-fontconfig --enable-gnutls --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-pic --enable-postproc --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-vdpau --enable-version3 --enable-x11grab
  libavutil      54.  7.100 / 54.  7.100
  libavcodec     56.  1.100 / 56.  1.100
  libavformat    56.  4.101 / 56.  4.101
  libavdevice    56.  0.100 / 56.  0.100
  libavfilter     5.  1.100 /  5.  1.100
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  0.100 /  3.  0.100
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  0.100 / 53.  0.100
[h264 @ 0x1472380] missing picture in access unit with size 27
[h264 @ 0x1472380] no frame!
Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 64.162569, bitrate: N/A
    Stream #0:0: Video: h264 (High), yuv420p, 1280x720, -5 kb/s, 30 fps, 30 tbr, 1000k tbn, 2000k tbc
Output #0, rtp, to 'rtp://224.0.1.2:5001':
  Metadata:
    encoder         : Lavf56.4.101
    Stream #0:0: Video: h264, yuv420p, 1280x720, q=2-31, -5 kb/s, 30 fps, 90k tbn, 1000k tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 224.0.1.2
t=0 0
a=tool:libavformat 56.4.101
m=video 5001 RTP/AVP 96
b=AS:-5
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1

Press [q] to stop, [?] for help
frame=  438 fps= 46 q=-1.0 Lsize=    3823kB time=00:00:14.34 bitrate=2183.2kbits/s    
video:3788kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.942992%

Acho que o problema pode estar nas duas linhas [h264 @ . Quanto mais eu estou investigando, mais parece que o fluxo de H264 vindo da câmera está faltando keyframes, ou algum tipo de quadro de informação explicando o tamanho do vídeo. Estes metadados podem ser adicionados pelo ffmpeg sem transcodificação, se é realmente o problema?

    
por Malvineous 22.10.2014 / 12:57

0 respostas