Android将多个视频文件拼接为一个文件

正文

利用android的2个类MediaExtractor(抽取音/视频帧) + MediaMuxer
(将音视频重新写入一个多媒体文件,完成封装)。

合成文件为MP4。为啥是MP4? 因为android支持最好的就是这个格式。MediaMuxer的native实现者是MPEG4Writer。

合成mp4视频主要有三个步骤:
1. 开始时,创建MediaMuxer,写入文件头部ftyp;
2. 进行时,遍历文件,读取每一帧,实时写入新文件的数据块mdat,并在内存中存储trak表。到下一个文件时,pts offset增加;
3. 所有文件都读取完,结束,索引信息trak表写入moov。关闭文件描述符。

话不多说,直接给github的demo代码:
https://github.com/xf420811/VideoComposerDemo

关于视频合成的一些问题

1. 前后2个视频的video fps不一样,有关系吗?
没有关系。底层decoder不会因为fps有变化,就不解码。做render的时候,是根据pts做显示,不会用fps。(fps一般用于pts没有,或者出错时,decoder根据fps重新计算pts,送给render。)

2. 前后2个视频的video codec不一样,有关系吗?
有关系。底层decoder会根据不同的codec建立真正的decoder实例,如AVCDecoder, HEVCDecoder,到解码完成前,这个无法实时切换。

3. 前后2个视频的video 分辨率不一样,有关系吗?
有关系。底层decoder解码时,会根据分辨率等参数,创建解码后的Output Buffer, 假设分辨率突然变大了,那buffer大小就不够,无法存储,会崩溃。

4. Audio sample rate /channel number不一样有关系吗?
有关系。因为这2个参数,在播放音频时,底层建立decoder,就需要设置这2个参数,如果解码到一半,突然变了,一声道变成2声道了,或者sample rate从44.1k变成32k了,那有些厂商如果不支持sample rate动态变化,就会出错,最终效果,很可能是播放时变成杂音。

你可能感兴趣的:(Android将多个视频文件拼接为一个文件)