深入剖析ijkplayer解码过程

方法汇总

1.alloc 操作:初始化ffmpeg的配置参数,创建渲染所用的EGLView,获取音频播放权限,注册前后台切换通知等。
2.prepareToPlay操作:创建音频输出,调用stream_open方法
3.stream_open 操作: 创建音视频队列,创建read_thread线程
至此,后续的所以音视频相关操作都在read_thread方法中进行.

4.read_thread操作: 在读取方法中,进行了基本的ffmpeg 解码操作。

  • avformat_open_input 初始化avformatcontext
  • avformat_find_stream_info 解码得到stream的信息
  • 根据codec_type区别音频视频流数据
  • stream_componet_open()
  1. stream_componet_open 操作,进行了解码器部分的操作
  • avcodec_alloc_context3进行AVCodecContext初始化
  • avcodec_find_decoder 查找对应解码器
  • avcodec_open2AVCodecContext实例化赋值,在源码中可以看到其本身的解析,open2 操作需要遵从一系列的方法。
  • decoder_init初始化解码线程
  • ffpipeline_open_video_decoder 根据配置进行 硬解码/软解码 选择
  • decode_start 开启解码操作,解码在固定的方法video_thread方法执行,video_thread使用多态实现了软/硬 解码区别

软解码操作

  1. ffp_video_thread ->ffplay_video_thread->get_video_frame->decoder_decode_frame->queue_picture
  • 软解码的主要操作都是在decoder_decode_frame上,操作的是avcodec_send_packetavcodec_receive_frame方法,在解码完成将picture 交由SDL进行渲染。

硬解码操作

  1. videotoolbox_video_thread->decode_frame(地址为videotoolbox_async_decode_frame)->decode_video->decode_video_internal
  • 至此,硬解码数据完成,在解码之后数据通过callback 传递硬解码数据,由内部的QueuePicture方法转到软解码的queue_picture 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值