好久不见,AiLo肥来了!
原文地址
原创文章,转载请联系作者
醉拍春衫惜旧香,天将离恨恼疏狂。
年年陌上生秋草,日日楼中到夕阳。
目的
- MediaCodeC搭配MediaExtractor将视频完整解码
- 视频帧存储为JPEG文件
- 使用两种方式达成
- 硬编码输出数据二次封装为YuvImage,并直接输出为JPEG格式文件
- 硬编码搭配Surface,用OpenGL封装为RGBA数据格式,再利用Bitmap压缩为图片文件
- 二者皆可以调整图片输出质量
参考
- YUV的处理方式,强推大家观看这篇文章高效率得到YUV格式帧,绝对整的明明白白
- OpenGL的处理方式,当然是最出名的BigFlake,硬编码相关的示例代码很是详细
解码效率分析
- 参考对象为一段约为13.8s,H.264编码,FPS为24,72*1280的MPEG-4的视频文件。鸭鸭戏水视频
- 此视频的视频帧数为332
- 略好点的设备解码时间稍短一点。但两种解码方式的效率对比下来,
OpenGl渲染
耗费的时间比YUV转JPEG
多。- 另:差一点的设备上,这个差值会被提高,约为一倍多。较好的设备,则小于一倍。
实现过程
对整个视频的解析,以及压入MediaCodeC输入队列都是通用步骤。
mediaExtractor.setDataSource(dataSource)
// 查看是否含有视频轨
val trackIndex = mediaExtractor.selectVideoTrack()
if (trackIndex < 0) {
throw RuntimeException("this data source not video")
}
mediaExtractor.selectTrack(trackIndex)
fun MediaExtractor.selectVideoTrack(): Int {
val numTracks = trackCount
for (i in 0 until numTracks) {
val format = getTrackFormat(i)
va