Android:MediaCodeC硬编码解码视频,并将视频帧存储为图片文件

本文介绍了如何使用MediaCodec在Android上硬编码解码视频,并将视频帧保存为JPEG图片。通过两种方式实现:一是将YUV数据封装为YuvImage并直接输出;二是结合OpenGL渲染输出RGBA数据,再用Bitmap压缩成图片。文章还分析了解码效率,并提供了实现过程的详细步骤。
摘要由CSDN通过智能技术生成

好久不见,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)
        val mime = format.getString(Med
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值