Rya*_*ath 1 audio mp4 multimedia
我写了一个MP4解析器,它可以很好地读取MP4中的原子,并将它们拼接在一起 - 结果是一个技术上有效的MP4文件,Quicktime可以打开等等,但它不能播放任何音频,因为我相信定时/采样信息全部关闭.我应该提一下,我只对音频感兴趣.
我正在做的是尝试从现有的MP4中取出moov atoms/etc,然后只取一个文件中mdat原子的子集来创建一个新的,更小的MP4.在这方面,我已经改变了duration在mvhd原子,以及在时间mdia头.tkhd这个文件中没有原子有编辑,所以我相信我不需要改变那里的持续时间 - 我错过了什么?
在创建新的MP4时,我正确地mdat使用宽盒子对块进行切片,并将'mdat'标题/大小保持在正确的位置 - 我确保使用新内容更新大小.
现在它完全有110%可能我错过了一些关于格式的重要内容,但如果可能的话,我很想得到最后一块.有人有任何意见/想法吗?
代码可以在以下链接中找到:
dev*_*rts 26
我打算在黑暗中捅一下,说你没有stbl正确更新你的补偿.至少我没有(乍一看)看到你的python在任何地方都这样做.
让我们从数据的位置开始.数据包以块的形式写入文件中,标题告诉解码器这些块的每个"块"存在于何处.该stsc表说明每个块有多少项.该first chunk说,新的块的开始.这有点令人困惑,但看看我的例子.这就是说每个chunkk有100个样本,直到第8个块.在第8个块有98个样本.

也就是说,您还必须跟踪这些块的偏移量.这是stco桌子的工作.所以,文件中的块偏移量为1,或者块偏移量为2等.

如果您修改了任何数据,mdat则必须维护这些表.你不能只是剔除mdat数据,并期望解码器知道该怎么做.
好像这还不够,现在你还必须维护样本时间表(stts)样本大小表(stsz),如果这是视频,则同步样本表(stss).
stts表示样本应按时间单位播放多长时间.如果你正在做音频,时间刻度可能是44100或48000(kHz).

如果你已经删除了一些数据,现在一切都可能不同步.如果这里的所有值都具有完全相同的持续时间,尽管你没事.
stsz说每个样本的大小以字节为单位.这对于解码器能够从一个块开始,然后按其大小遍历每个样本很重要.

同样,如果所有样本大小完全相同,那么你就可以了.音频往往几乎相同,但视频内容变化很大(关键帧等等)
最后但并非最不重要的是,我们有stss表格说哪个框架是关键帧.我只有AAC经验,但每个音频帧都被认为是一个关键帧.在这种情况下,您可以有一个描述所有数据包的条目.

与原始问题相关,时间显示并不总是在每个玩家中以同样的方式表现出来.最准确的方法是总结标题中所有帧的持续时间,并将其用作总时间.其他玩家使用轨道标题中的元数据.我发现最好保持所有的价值相同然后玩家很开心.
如果你正在做所有这些并且我在脚本中错过了它,那么你可以发布一个示例mp4和一个独立的应用程序,我可以尝试帮助你.