gpt4 book ai didi

ffmpeg - 将 h264 字节流重新打包到 Matroska 输出

转载 作者:行者123 更新时间:2023-12-04 23:02:28 24 4
gpt4 key购买 nike

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

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

我正在使用 ffmpeg 和 bytedeco/javacpp-presets 创建 mkv Java的桥梁。

出于某种原因,我的输出 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 没有为我的文件显示任何内容?有没有我可以启用的详细模式,一些日志来看看它是否提示什么?

最佳答案

在数据流级别,您需要从 H.264's avcC Coder Configuration Atoms 中提取 SPS 和 PPS 项在每个文件的开头并将它们放入 Matroska SimpleBlock任何其他 H.264 数据之前的 block 。
或者,您可以将 avcC 数据缓冲区逐字放入 Segment/Tracks/Track/Codec 私有(private)数据 header 中的 .mkv 流中。
SPS 和 PPS 是独立的 NALU,Matroska 将它们串联存储在 byte stream format 中在 SimpleBlocks 中。
H.264 视频解码器需要 SPS 和 PPS 中的数据才能工作。

关于ffmpeg - 将 h264 字节流重新打包到 Matroska 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57074713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com