正文

利用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动态变化,就会出错,最终效果,很可能是播放时变成杂音。

更多相关文章

  1. 剖析andriod联系人
  2. Android加载SVG实现交互式地图绘制
  3. Android(安卓)截图实现(2)
  4. 经典Android试题及答案
  5. Android(安卓)发送HTTP GET POST 请求以及通过 MultipartEntityB
  6. android中apk反编译
  7. [Android] 单独编译生成boot.img时mkbootfs: No such file or di
  8. 类加载器
  9. Android中Activity的初步接触(一)

随机推荐

  1. Redis日常操作命令小结
  2. confluence与jira账号对接、查看到期时间
  3. zabbix监控交换机、防火墙等网络设备
  4. ELK基础架构解说-运维笔记
  5. 作用域与闭包;类与类的继承
  6. JavaScript:实例演示dom元素的增删改查操
  7. 商业智能与数据可视化的碰撞,能带来什么效
  8. Python列表的常用方法
  9. 给iOS中高级面试官的一份招聘要求!
  10. 关于机器学习和人工神经网络