我有两个MP4文件,比如说,
两者都是由同一个应用程序生成的。我想以编程方式连接它们。我已经阅读了ISO / IEC 14496-12文档并搜索了一些可能的答案,但只有少数几个。
根据我到目前为止所读到的,如果我连接MDAT部分并合并STBL框的元素,如STTS,STSS,STSC,STSZ,STCO等,则可以连接文件。
我尝试过使用上面提到的策略,我编辑了MVHD和MDHD中的持续时间部分,如下连接其他框并输出为新的mp4文件。
MDAT part of 1.mp4 -- MDAT part of 2.mp4 -- MOOV box (MOOV, MVHD, TRAK, MDIA, STBL, etc)
在STBL框中,我连接了两个文件中的元素,我对音频和视频部分使用相同的结构:
STTS(1.mp4) -- STTS(2.mp4) -- STSS(1.mp4) -- STSS(2.mp4) -- STSC(1.mp4) -- STSC(2.mp4) -- STSZ(1.mp4) -- STSZ(2.mp4) -- STCO(1.mp4) -- STCO(2.mp4)
但是,无法播放或打开输出文件。
如果我简单地连接两个文件的TRAK框,例如:
MOOV (MVHD -- TRAK (and all other boxes of 1.mp4) -- TRAK (and all other boxes of 1.mp4))
我可以播放输出文件,但持续时间与1.mp4 ...
相同关于我应该编辑哪些部分的任何建议或具体例子?
感谢。
答案 0 :(得分:3)
首先,要以编程方式连接2个mp4文件,您需要确保两个文件包含相同的音频和视频编解码器。
您需要检查音轨和视频轨道并比较编解码器类型。例如,如果一个文件视频编解码器是H.264而另一个文件视频编解码器是H.263则那么这两个不能连接。音轨也可能有不同的编解码器(例如amr,aac)。
由于您写道两个文件都是使用相同的应用程序创建的,因此可以假设它们都使用相同的音频和视频编解码器。
为了连接它们,确实可以将第二个文件的mdat
原子数据连接到第一个文件的mdat
原子数据。然后应更新mdat
原子大小以表示两个mdat
原子大小的总和。
对于其他原子,没有简单的方法来处理它们。例如,对于表示块偏移的stco
atom,您需要添加第二个文件音频/视频样本的所有偏移量(每个音频/视频有一个stco
个原子跟踪)。然而,当添加到第一个文件时,这些音频/视频样本改变了它们的偏移量,因此您需要计算每个块的新偏移量。其他原子也需要改变。例如stsz
包含样本数量及其大小。
在stss
原子中,您需要更新关键帧的总数并添加所有第二个文件关键帧,但是必须更改第二个文件的每个样本编号(您'我需要添加第一个文件的关键帧数量。)
您需要查看ISO / IEC 14496-12文档并根据规范处理每个原子。