如何在不转码的情况下进行 H264 直播多播?

如何在不转码的情况下进行 H264 直播多播?

我有一个实时的 H264 流(通过网络摄像头硬件编码),我想在 Linux 平台上使用多播通过网络进行流式传输。

由于平台的 CPU 能力有限,并且来自摄像头的数据已经是 H264 格式,所以我不想对流进行转码 - 只是按原样广播,也许需要在所需的传输容器中进行额外的包装。

我尝试过这个:

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

它确实似乎多播数据,但是当我去播放流时,我收到一堆错误:

[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!

为什么这行不通?您应该如何多播现有的原始 H264 数据流?

编辑:根据要求,当我运行上述 ffmpeg 命令时,会产生以下结果:

ffmpeg 版本 2.4.2 版权所有 (c) 2000-2014 FFmpeg 开发人员
  于 2014 年 10 月 15 日 06:19:14 使用 gcc 4.8.2 (GCC) 20131219 (预发布) 构建
  配置:--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] 访问单元中缺少大小为 27 的图片
[h264@0x1472380] 没有框架!
输入 #0,video4linux2,v4l2,来自‘/dev/video0’:
  时长:N/A,开始:64.162569,比特率:N/A
    流 #0:0:视频:h264(高)、yuv420p、1280x720、-5 kb/s、30 fps、30 tbr、1000k tbn、2000k tbc
输出 #0,rtp,到‘rtp://224.0.1.2:5001’:
  元数据:
    编码器:Lavf56.4.101
    流 #0:0:视频:h264、yuv420p、1280x720、q=2-31、-5 kb/s、30 fps、90k tbn、1000k tbc
流映射:
  流 #0:0 -> #0:0 (复制)
新加坡民主党:
v=0
o=-0 0 在 IP4 127.0.0.1
s=无名称
c=IN IP4 224.0.1.2
t=0 0
a=工具:libavformat 56.4.101
m=视频 5001 RTP/AVP 96
b=AS:-5
一个=rtpmap:96 H264/90000
a=fmtp:96 分组模式=1

按 [q] 停止,按 [?] 获取帮助
帧=438 fps=46 q=-1.0 Lsize=3823kB 时间=00:00:14.34 比特率=2183.2kbits/s    
视频:3788kB 音频:0kB 字幕:0kB 其他流:0kB 全局标头:0kB 多路复用开销:0.942992%

我认为问题可能出在这两条[h264 @线上。我调查得越多,就越觉得来自摄像头的 H264 流要么缺少关键帧,要么缺少某种信息帧来解释视频大小。如果确实是问题所在,ffmpeg 是否可以在不转码的情况下添加此“元数据”?

相关内容