以编程方式连接mp4文件

时间:2014-04-02 04:14:24

标签: c video mp4

我有两个MP4文件,比如说,

  1. mp4(20秒)和
  2. mp4(20秒);
  3. 两者都是由同一个应用程序生成的。我想以编程方式连接它们。我已经阅读了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 ...

    相同

    关于我应该编辑哪些部分的任何建议或具体例子?

    感谢。

1 个答案:

答案 0 :(得分:3)

首先,要以编程方式连接2个mp4文件,您需要确保两个文件包含相同的音频和视频编解码器。

您需要检查音轨和视频轨道并比较编解码器类型。例如,如果一个文件视频编解码器是H.264而另一个文件视频编解码器是H.263则那么这两个不能连接。音轨也可能有不同的编解码器(例如amr,aac)。

由于您写道两个文件都是使用相同的应用程序创建的,因此可以假设它们都使用相同的音频和视频编解码器。 为了连接它们,确实可以将第二个文件的mdat原子数据连接到第一个文件的mdat原子数据。然后应更新mdat原子大小以表示两个mdat原子大小的总和。

对于其他原子,没有简单的方法来处理它们。例如,对于表示块偏移的stco atom,您需要添加第二个文件音频/视频样本的所有偏移量(每个音频/视频有一个stco个原子跟踪)。然而,当添加到第一个文件时,这些音频/视频样本改变了它们的偏移量,因此您需要计算每个块的新偏移量。其他原子也需要改变。例如stsz包含样本数量及其大小。

stss原子中,您需要更新关键帧的总数并添加所有第二个文件关键帧,但是必须更改第二个文件的每个样本编号(您'我需要添加第一个文件的关键帧数量。)

您需要查看ISO / IEC 14496-12文档并根据规范处理每个原子。