我有一个应用程序可以捕获用户的多个视频流,并将它们放入一个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对我的文件不显示任何内容?我可以启用任何详细模式吗?有一些日志可以查看它是否抱怨什么?
答案 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中的数据才能正常工作。