我有一个应用程序,它从用户那里捕获多个视频流并将它们放入一个 mkv 输出文件中。
数据来自 RTP 数据包。我使用 h264。
我正在使用 ffmpeg 和 Javabytedeco/javacpp-presets
桥创建 mkv。
由于某种原因,我的输出 mkv,在将容器更改为 mp4 (ffmpeg -i input.mkv -c copy output.mp4
) 后无法通过 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
原始数据的容器,因为它保留了一些计时信息,但结果与原始 mkv 相同 - QuickTime 中的黑框。
也许还有其他方法可以调试为什么 QT 不显示我的文件?我可以启用任何详细模式,一些日志以查看它是否抱怨某些内容?
在数据流级别,您需要在每个文件的开头从 H.264 的avcC
Coder Configuration Atoms 中提取 SPS 和 PPS 项目,并在任何其他 H.264 数据之前将它们放入 Matroska SimpleBlock 块中。
或者,您可以将 avcC 数据缓冲区逐字放入 .mkv 流中,位于段/轨道/轨道/编解码器的私有数据的标头中。
SPS 和 PPS 是独立的 NALU,Matroska 将它们以字节流格式连接存储在 SimpleBlock 中。
H.264 视频解码器需要 SPS 和 PPS 中的数据才能工作。