修复直播的视频容器关键帧

修复直播的视频容器关键帧

我有一个采集卡一个程序我打算在 Raspberry Pi 3 上运行它(我为它编译了它),以便将视频本地传输到 Chromecast。运行此程序并将视频数据吐出到带有 H.264 和 AAC 编解码器的 MPEG-TS 容器中的标准输出。

我编写了一个脚本,基本上将其分段以提供HLS / m3u8流:

./HDPVR2-testApp | ffmpeg -i - -c copy -f hls -hls_time 2 -hls_flags +delete_segments -hls_list_size 3 -hls_segment_filename /tmp/stream/file_%v_%03d.ts /tmp/stream/out.m3u8

这在几乎所有视频播放器上都能很好地运行,除了 Chrome(cast) 拒绝播放流。CORS 配置正确。

chrome://media-internals使用下一条消息进行调试时不断出现:

视频帧的 ISO-BMFF 容器元数据表明该帧是关键帧,但视频帧内容表明相反。

进一步调查后,我发现Chrome 对如何播放视频格式的要求更加严格

依照指示这个答案,提取 H.264 流并重新混合到文件解决了这个问题,使 Chrome 和 Chromecast 都可以播放该流。我使用管道 ( cat fixed-recording.mp4 | ffmpeg -i - ...) 进行了测试,只是为了确保这不是问题。

有没有办法可以动态使用 ffmpeg 修复容器关键帧?我需要在 RPi 3 中运行它,这意味着我无法重新编码视频,而且我宁愿不将大文件写入磁盘。这是我尝试过的:

  • 使用-movflags empty_moov+default_base_moof+frag_keyframe及其组合(来自 StackOverflow)。
  • 改用碎片化的 MP4 流。
  • 将原始流提取到两个文件,但由于两个文件都需要不断写入而失败。

相关内容