我有一个应用程序,可以捕获用户的多个视频流,并将它们放入一个mkv输出文件中。
数据来自RTP数据包。我使用h264。
我正在创建mkv使用ffmpeg和bytedeco/javacpp-presets桥的Java。
由于某些原因,在将容器更改为mp4 (ffmpeg -i input.mkv -c copy output.mp4)后,我的输出mkv不能由QuickTime播放器播放。它会打开文件,但在整个持续时间内只显示黑色边框。
我在试着避免流的重新编码。
我尝试解决这个问题的方法之一是以某种方式打包原始的h264字节流,并使用ffmpeg再次将其放入mkv中:ffmpeg -i input.mkv -c copy -f h264 - | ffmpeg -i - -c copy output.mkv
但是因为原始h264字节流没有计时信息(ffmpeg警告这里缺少时间戳),所以它用一些恒定的帧速率对其进行打包,从而导致与原始视频持续时间不同。因此,从27分钟的视频,我得到了30分钟的恒定帧率。
我正在寻找一种方法,可以将我的h264视频数据重新打包到mkv容器中,而不需要重新编码。
我还尝试了原始数据的NUT容器,因为它保存了一些计时信息,但结果与QuickTime中原始的mkv - black帧相同。
也许还有其他方法可以调试为什么QT对我的文件什么都不显示?有没有什么详细的模式,我可以启用,一些日志,看看它是否抱怨什么?
发布于 2019-07-25 19:35:02
在数据流级别,您需要在每个文件的开头从H.264's avcC Coder Configuration Atoms中提取SPS和PPS项,并在任何其他H.264数据之前将它们放入Matroska SimpleBlock块中。
或者,您可以将avcC数据缓冲区逐字放入您的.mkv流中的段/磁道/磁道/编解码器的私有数据的头部。
SPS和PPS是独立的NALU,Matroska将它们串联存储在SimpleBlocks中的byte stream format中。
H.264视频解码器需要SPS和PPS中的数据才能工作。
https://stackoverflow.com/questions/57074713
复制相似问题