我有一个采集卡由一个程序我打算在 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 流。
- 将原始流提取到两个文件,但由于两个文件都需要不断写入而失败。