音视频FFmpeg
音视频FFmpeg
该文记录音视频入门学习。
FFmpeg
1. FFmpeg的安装
1.1. FFmpeg库的下载
FFmpeg
源码地址:https://github.com/FFmpeg/FFmpegFFmpeg
可执行文件地址:https://ffmpeg.org/download.html
1.2. FFmpeg库介绍
ffmpeg.exe
:用于音视频转码, 也可以从url/现场音频/视频源抓取输入源。ffplay.exe
:一个非常简单和可移植的媒体播放器,使用FFmpeg库和SDL库。ffprobe.exe
:查看多媒体文件的信息。
1.3. Windows平台FFmpeg的部署
将 FFmpeg
可执行文件加入系统环境变量即可。
2. FFmpeg篇(解码)
2.1. 开发环境
FFmpeg
开发库下载地址(自行选定版本号,-shared 为开发库):
1
https://github.com/BtbN/FFmpeg-Builds/releases
SDL 开发库下载地址(选择Dev-VC):
1
https://github.com/libsdl-org/SDL/releases
2.2. 音视频解码
音视频解码流程
2.3. 音视频播放
Windows平台使用SDL2来播放音视频
3. FFmpeg篇(编码)
3.1. FFmpeg编码视频
使用 FFmpeg
库编码 YUV
,代码及调用逻辑如下:
3.2. FFmpeg编码音频
使用 FFmpeg
库编码 PCM
,代码及调用逻辑如下:
4. FFmpeg篇(转码)
转码比较好理解,就是将解码和编码结合起来,过程为:解封装->解码->编码->封装。逻辑如下:
- 解封装:将音视频文件的封装格式去掉,获取视频流(H.264)和音频流(AAC)
- 解码:将视频流解码成原始图像数据(YUV),将音频流解码成原始音频数据(PCM)
- 编码:将原始图像(YUV)进行编码(MPG2),将音频流进行编码(MP3)
- 封装:将视频流和音频流封装成视频文件
5. ffplay源码分析
做一个真正的播放器,还有很多问题需要处理:音视频同步,多线程解复用、解码,线程安全等问题需要处理。
ffplay解码并播放音视频的源码分析如图所示(分为两条主线,一条为解复用、解码,另一条为事件循环(包含音视频播放)):
5.1. 解复用、解码
- stream_open:起始入口
- audio_thread:音频处理线程
- 音频数据流转:audioq(编码数据)->sampq(解码数据)
- video_thread:视频处理线程
- 视频数据流转:videoq(编码数据)->pictq(解码数据)
- subtitle_thread:字幕解码线程
- 字幕数据流转:subtitleq(编码数据)->subpq(解码数据)
5.2. 事件循环(包含音视频播放)
- event_loop:起始入口
- refresh_loop_wait_event:显示音视频(包括音视频同步)
5.3. 事件循环
- 事件循环函数调用SDL_PeepEvents函数,查看事件队列中是否有事件存在
- 如果有事件(如键盘、鼠标等事件),优先处理事件
- 如果事件队列中没有事件,则播放音视频
本文由作者按照 CC BY 4.0 进行授权