将h264字节流重新打包为Matroska输出

时间:2019-07-17 11:23:06

标签: ffmpeg h.264 rtp quicktime

我有一个应用程序可以捕获用户的多个视频流,并将它们放入一个mkv输出文件中。

数据来自RTP数据包。我使用h264。

我正在使用ffmpeg和bytedeco/javacpp-presets Java桥创建mkv。

由于某种原因,将容器更改为mp4(ffmpeg -i input.mkv -c copy output.mp4)后,我的输出mkv无法由QuickTime Player播放。它会打开文件,但在整个持续时间内只会显示黑框。

我正在尝试避免对流进行重新编码。

我要解决此问题的尝试之一是以某种方式打包原始h264字节流,并使用ffmpeg将其再次放入mkv: ffmpeg -i input.mkv -c copy -f h264 - | ffmpeg -i - -c copy output.mkv

但是,由于原始的h264字节流没有时序信息(ffmpeg在此警告缺少时间戳),因此它以一定的恒定帧速率对其进行打包,从而导致视频时长与原始时长不同。因此,从27分钟的视频中,我可以获得30分钟的恒定帧速率。

我正在寻找一种无需重新编码即可将我的h264视频数据重新打包到mkv容器中的方法。

我还尝试了NUT容器来存储原始数据,因为它保留了一些计时信息,但结果与原始mkv相同(QuickTime中为黑框)。

也许还有其他方法可以调试为什么QT对我的文件不显示任何内容?我可以启用任何详细模式吗?有一些日志可以查看它是否抱怨什么?

1 个答案:

答案 0 :(得分:0)

在数据流级别,您需要在每个文件的开头从H.264's avcC Coder Configuration Atoms中提取SPS和PPS项,并将它们放入Matroska SimpleBlock块中,然后再放置任何其他H.264数据。

SPS和PPS是独立的NALU,Matroska将它们串联存储在byte stream format中的SimpleBlocks中。

H.264视频解码器需要SPS和PPS中的数据才能正常工作。