ffplay实现原理

ffmpeg是一个跨平台的音视频处理框架,提供了从录制到播放的全套解决方案,包括解协议、解封装、解码、编码、滤镜等功能。ffplay是基于ffmpeg的简单播放器,利用SDL实现拉流、解码和播放。其内部有多个线程协同工作,包括读取线程、音频解码线程、音频播放线程和视频解码线程,通过复杂的同步机制保证音视频同步播放。ffmpeg的优势在于其强大的扩展性和跨平台性,能适应各种协议和编解码器。

1. ffmpeg是音视频界的瑞士军刀:

  1. 它提供了从录制、编码、封装、推流到拉流、解封装、解码、滤镜、播放的完整解决方案。
  2. 它是跨平台的解决方案,一套代码适配Windows、Linux、Mac OS、iOS、Andriod。
  3. 它原生支持hls、dash、rtmp、rtsp、http、tcp等主流协议,并提供统一的扩展方式方便扩展自己的协议,比如tutk、webrtc等,目前已经有开源库metaRTC可通过扩展集成到ffmpeg中实现webrtc的推拉流。
  4. 它支持或插件支持所有封装格式的封装和解封装。
  5. 它支持或插件支持所有音视频编码格式的编码和解码。主要视频代表有H264、H265,主要音频代表有aac、opus。
  6. 它已经内置一百多种滤镜并提供方式可以添加自定义滤镜。也可以在这个地方添加OpenGL,支持自定义GPU管线。
  7. 它解码后的音视频数据可以通过SDL(对不同平台提供一套统一的接口,调用不同的底层API库)去渲染视频和播放音频。可以通过OpenGLES去渲染视频,OpenGLES是OpenGL的子集,所以OpenGLES也可以在PC端渲染。

2. ffplay实现原理

1. ffplay是ffmpeg官方提供的播放器

它基于ffmpeg的强大功能,结合SDL实现了从拉流、解协议、解封装、音频解码、视频解码、音频播放、视频播放的一体化功能。

2. 以下是ffplay整体播放流程图:

Created with Raphaël 2.3.0 开始/©王方帅 拉流 解协议 是音频包? 音频解码 音频播放(音视频同步) 结束/©王方帅 是视频包? 视频解码 视频播放(音视频同步) yes no yes

3. ffplay有5个主要线程:

  1. 解协议、解封装线程: read_thread
  2. 音频解码线程:audio_thread
  3. 音频播放线程:sdl_audio_callback
  4. 视频解码线程:video_thread
  5. 视频播放线程(主线程):video_refresh

以上各线程之间各司其职、通力合作、有任务处理任务、无任务休眠等待其他线程唤醒继续执行任务。

4. 以下是各线程执行结构体关系图:

  1. read_thread

    负责解协议、解封装、将AVPacket放入音频PacketQueue或视频PacketQueue:

通过avformat_open_input解协议+解封装
no
yes
yes
no
yes
read_thread/王方帅
filename
AVFormatContext
stream_component_open根据解封装后音视频codec_id初始化Decoder
for循环
stream_has_enough_packets/audioq/videoq
enough
av_read_frame
AVPacket
SDL_CondWait
音频包?
packet_queue_put/audioq
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王方帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值