首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将h264字节流重新打包为Matroska输出

将h264字节流重新打包为Matroska输出
EN

Stack Overflow用户
提问于 2019-07-17 19:23:06
回答 1查看 269关注 0票数 1

我有一个应用程序,可以捕获用户的多个视频流,并将它们放入一个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对我的文件什么都不显示?有没有什么详细的模式,我可以启用,一些日志,看看它是否抱怨什么?

EN

回答 1

Stack Overflow用户

发布于 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中的数据才能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57074713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档