1. ffmpeg是音视频界的瑞士军刀:
- 它提供了从录制、编码、封装、推流到拉流、解封装、解码、滤镜、播放的完整解决方案。
- 它是跨平台的解决方案,一套代码适配Windows、Linux、Mac OS、iOS、Andriod。
- 它原生支持hls、dash、rtmp、rtsp、http、tcp等主流协议,并提供统一的扩展方式方便扩展自己的协议,比如tutk、webrtc等,目前已经有开源库metaRTC可通过扩展集成到ffmpeg中实现webrtc的推拉流。
- 它支持或插件支持所有封装格式的封装和解封装。
- 它支持或插件支持所有音视频编码格式的编码和解码。主要视频代表有H264、H265,主要音频代表有aac、opus。
- 它已经内置一百多种滤镜并提供方式可以添加自定义滤镜。也可以在这个地方添加OpenGL,支持自定义GPU管线。
- 它解码后的音视频数据可以通过SDL(对不同平台提供一套统一的接口,调用不同的底层API库)去渲染视频和播放音频。可以通过OpenGLES去渲染视频,OpenGLES是OpenGL的子集,所以OpenGLES也可以在PC端渲染。
2. ffplay实现原理
1. ffplay是ffmpeg官方提供的播放器
它基于ffmpeg的强大功能,结合SDL实现了从拉流、解协议、解封装、音频解码、视频解码、音频播放、视频播放的一体化功能。
2. 以下是ffplay整体播放流程图:
3. ffplay有5个主要线程:
- 解协议、解封装线程: read_thread
- 音频解码线程:audio_thread
- 音频播放线程:sdl_audio_callback
- 视频解码线程:video_thread
- 视频播放线程(主线程):video_refresh
以上各线程之间各司其职、通力合作、有任务处理任务、无任务休眠等待其他线程唤醒继续执行任务。
4. 以下是各线程执行结构体关系图:
1. read_thread
负责解协议、解封装、将AVPacket放入音频PacketQueue或视频PacketQueue:

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





