方法汇总
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()
stream_componet_open
操作,进行了解码器部分的操作
avcodec_alloc_context3
进行AVCodecContext
初始化avcodec_find_decoder
查找对应解码器avcodec_open2
为AVCodecContext
实例化赋值,在源码中可以看到其本身的解析,open2 操作需要遵从一系列的方法。decoder_init
初始化解码线程ffpipeline_open_video_decoder
根据配置进行 硬解码/软解码 选择decode_start
开启解码操作,解码在固定的方法video_thread
方法执行,video_thread使用多态实现了软/硬 解码区别
软解码操作
ffp_video_thread
->ffplay_video_thread
->get_video_frame
->decoder_decode_frame
->queue_picture
- 软解码的主要操作都是在
decoder_decode_frame
上,操作的是avcodec_send_packet
和avcodec_receive_frame
方法,在解码完成将picture 交由SDL进行渲染。
硬解码操作
videotoolbox_video_thread
->decode_frame(地址为videotoolbox_async_decode_frame)
->decode_video
->decode_video_internal
- 至此,硬解码数据完成,在解码之后数据通过
callback
传递硬解码数据,由内部的QueuePicture
方法转到软解码的queue_picture
方法。