深入剖析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 方法。

你可能感兴趣的:(音视频开发)