前面的文章介绍了FFmpeg的解码、编码、转码流程以及相关的函数调用,并以FFmpeg解码流程为主线,深入分析其中层层调用的FFmpeg代码,想必大家对FFmpeg的编解码有了一个全面的了解。学到这里,你可能想那是不是就可以做一个播放器了?
做一个真正的播放器,还有很多问题需要处理:音视频同步,多线程解复用、解码,线程安全等问题需要处理。那带着这些问题,本篇文章将分析下ffplay(FFmpeg提供的一个简单的播放器)的源码。
ffplay解码并播放音视频的源码分析如图所示(分为两条主线,一条为解复用、解码,另一条为事件循环(包含音视频播放)):
1.解复用、解码
◆ stream_open:起始入口
◆ audio_thread:音频处理线程
◆ 音频数据流转:audioq(编码数据)->sampq(解码数据)
◆ video_thread:视频处理线程
◆ 视频数据流转:videoq(编码数据)->pictq(解码数据)
◆ subtitle_thread:字幕解码线程
◆ 字幕数据流转:subtitleq(编码数据)->subpq(解码数据)
2.事件循环(包含音视频播放)
◆ event_loop:起始入口
◆ refresh_loop_wait_event:显示音视频(包括音视频同步)
◆ 事件循环函数调用SDL_PeepEvents函数,查看事件队列中是否有事件存在
◆ 如果有事件(如键盘、鼠标等事件),优先处理事件
◆ 如果事件队列中没有事件,则播放音视频
音视频入门系列文章已同步在微信公众号(可扫下方二维码关注):八小时码字员
音视频入门系列,同步录制了学习视频,已上传至bilibili(八小时码字员):音视频入门系列(图像、音频、字幕、视频封装格式,FFmpeg、ffplay源码分析,解码、编码、转码,流媒体协议,服务器部署)_哔哩哔哩_bilibili
音视频学习交流QQ群:693316541