1

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

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

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

出于某种原因,我的输出 mkv 在将容器更改为 mp4 ( ffmpeg -i input.mkv -c copy output.mp4) 后不能由 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 没有为我的文件显示任何内容?有没有我可以启用的详细模式,一些日志来看看它是否抱怨什么?

4

1 回答 1

0

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

或者,您可以将 avcC 数据缓冲区逐字放入 Segment/Tracks/Track/Codec 私有数据标头中的 .mkv 流中。

SPS 和 PPS 是独立的 NALU,Matroska 将它们以字节流格式串联存储在 SimpleBlocks 中。

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

于 2019-07-25T11:35:02.007 回答