Ffmpeg 通过TestStream将h264重新打包为Matroska输出

Ffmpeg 通过TestStream将h264重新打包为Matroska输出,ffmpeg,h.264,rtp,quicktime,matroska,Ffmpeg,H.264,Rtp,Quicktime,Matroska,我有一个应用程序,从用户那里捕获多个视频流,并将它们放入一个mkv输出文件中 数据来自RTP数据包。我用h264 我正在使用ffmpeg和bytedeco/javacpp预设创建mkv 出于某种原因,将容器更改为mp4后,QuickTime Player无法播放我的输出mkv(ffmpeg-i input.mkv-c copy output.mp4)。它打开文件,但在整个过程中只显示黑色边框 我试图避免对流进行重新编码 我试图解决这个问题的其中一个方法是通过TestStream将原始h264打包

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

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

我正在使用ffmpeg和
bytedeco/javacpp预设创建mkv

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

我试图避免对流进行重新编码

我试图解决这个问题的其中一个方法是通过TestStream将原始h264打包,然后使用ffmpeg将其再次放入mkv中:
ffmpeg-i input.mkv-c copy-f h264-| ffmpeg-i--c copy output.mkv

但由于原始h264 ByTestStream没有时间信息(ffmpeg警告此处缺少时间戳),因此它使用一些恒定的帧速率对其进行打包,从而导致与原始视频不同的视频持续时间。也就是说,从27分钟的视频中,我得到了30分钟的恒定帧速率

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

我还尝试了原始数据的
NUT
容器,因为它保存了一些计时信息,但结果与QuickTime中原始的mkv-black帧相同


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

在数据流级别,您需要从每个文件的开头提取SP和PPS项,并将它们放在任何其他H.264数据之前的块中

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

SP和PP是独立的NALU,Matroska将它们串联存储在SimpleBlock中


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

在数据流级别,您需要从每个文件的开头提取SPS和PPS项,并将它们放在任何其他H.264数据之前的块中

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

SP和PP是独立的NALU,Matroska将它们串联存储在SimpleBlock中

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