Android FFmpeg开发(二),实现视频解码和渲染

本文详细介绍了如何在Android中使用FFmpeg进行视频解码,通过libswscale转换YUV帧到RGB,再将RGB帧渲染到SurfaceView。文章涵盖了解码流程、帧渲染、同步控制的关键代码,并探讨了解码帧尺寸调整、格式转换和播放同步的问题。最后,作者总结了整个过程,并预告了对音频流解码和播放的后续内容。
摘要由CSDN通过智能技术生成

上一篇文章我们对FFmpeg进行交叉编译,得到了编译产物:libffmpeg.so,然后创建了一个Android项目,对libffmpeg.so库实现了集成,还没阅读上一篇文章建议先阅读:Android FFmpeg开发(一),FFmpeg编译与集成

本文将利用FFmpeg对本地MP4视频文件进行视频流解码,然后使用FFmpeg中的libswscale模块将原始视频YUV帧转成RGB帧,最后将RGB帧数据刷到SurfaceView的surface中实现视频画面的渲染。

接下来,介绍下利用FFmpeg完成视频解码、渲染的流程。

一、FFmpeg解码视频流

利用FFmpeg API对视频进行解码,然后将解码数据转换成RGBA格式数据,最后将画面数据刷到surface上,涉及到FFmpeg核心API调用流程如下:

解码流程代码如下:

 // 1. 创建封装格式上下文
 mAVFormatContext = avformat_alloc_context();

 // 2. 打开文件
 if (avformat_open_input(&mAVFormatContext, mUrl, NULL, NULL) != 0) {
     LOGD("BaseDecoder::initFFDecoder, avformat_open_input fail\n");
     break;
 }

 // 3. 获取音视频信息流信息
 if (avformat_find_stream_info(mAVFormatContext, NULL) < 0) {
     LOGD("BaseDecoder::initFFDecoder, avformat_find_stream_info fail\n");
     break;
 }

 // 4. 获取音视频流的索引
 for (int i = 0; i < mAVFormatContext->nb_streams; i++) {
     if (mAVFormatContext->streams[i]->codecpar->codec_type == mMediaType) {
         mStreamIndex = i;
         break;
     }
 }

 if (mStreamIndex == -1) {
     LOGD("BaseDecoder::initFFDecoder, failed to find stream index\n");
     break;
 }

 // 5. 获取解码器参数
 AVCodecParameters *codecParameters = mAVFormatContext->streams[mStreamIndex]->codecpar;

 // 6. 获取解码器
 mAVCodec = avcodec_find_decoder(codecParameters->codec_id);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值