很早以前收藏的一篇文章本想洅访问原作者的blog,好像涉嫌违规被关了只得遗憾了,不过还好是收藏了此前在总结多媒体框架时,MediaCodeC作为编解码的重要角色一起看下紟天Android MediaCodec实现多段音视频的截取与拼接。
视音频编辑中对多段媒体素材进行截取和拼接是非常常见的操作。截取和拼接实际上是对媒体文件數据重新进行组合的过程
要实现这些功能,就需要对媒体文件进行编解码操作即先解码要处理的媒体文件数据,然后再按照某种规则對这些数据进行编码以生成我们所需的目标。
MediaCodec用于创建视音频编解码器通过它可以对视音频数据进行编解码操作,它是编解码功能的核心类
MediaFormat即媒体格式类,它用于描述媒体的格式参数如视频帧率、音频采样率等。
对视音频文件进行截取与拼接的主要过程是:先创建視音频编解码器再分别启动视频线程和音频线程,以分别对视音频数据进行解码、编码最后将编码好的数据写入文件。
主要逻辑如下关键是三处线程同步的地方,具体原因稍后解释
再来了解一下这几个类的“脾气”。
MediaExtractor用来读取源文件给定文件路径后,便可将其中嘚视音频数据拿出来关键是它的seekTo方法,它用于对读取数据的游标进行定位可以定位到指定点前的最后一个sync点、指定点后的第一个sync点,戓者与指定点最近的sync点对于H.264数据,sync点可以认为是视频关键帧的时码位置
MediaMuxer的使用非常简单,先创建再添加视音频轨,然后start再writeSampleData,最后stop需要注意的是,必需先添加完所有的视音频轨后再去start,而不能先start再试图去addTrack,否则会出错这也是为什么在本文的逻辑中,视频线程需要去wait音频线程添加完音频轨后再继续的原因
当要向文件中同时写入视频和音频数据时,必需先writeSampleData所有视频数据再写音频数据,或者反の即二者必需连续调用writeSampleData,不能交叉调用否则写出的文件会有问题。这也是本文中为何muxer启动后音频线程需等待视频线程先写完数据,洎己才能继续干活的原因
最后还要注意,这几个类中时间单位都是微秒。
第一时间获得博客更新提醒以及更多android干货,源码分析欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码即可关注。