文章

音视频FFmpeg

音视频FFmpeg

该文记录音视频入门学习。

FFmpeg

1. FFmpeg的安装

1.1. FFmpeg库的下载

  • FFmpeg 源码地址:https://github.com/FFmpeg/FFmpeg

  • FFmpeg 可执行文件地址: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 进行授权