FFMPEG视音频编解码零基础学习方法
背景知识
FFmpeg是一个强大的开源软件项目,包含一套大量的库和程序,用于处理多媒体数据。它可以编码、解码、流式传输、过滤和播放几乎任何人类和及其创建的音频和视频。
-
使用FFMPEG作为内核视频播放器
Mplayer、 ffplay 射手播放器 暴风影音 KMPlayer QQ影音 -
使用FFMPEG作为内核的DirectshowFilter
ffdshow lav filters -
使用FFMPEG作为内核的转码工具
ffmpeg 格式共厂
1.转换视频格式:
ffmpeg -i 输入文件.mp4 输出文件.avi
2.从视频中提取音频:
ffmpeg -i 输入文件.mp4 -vn -acodec copy 输出文件.mp3
3.转换音频格式:
ffmpeg -i 输入文件.mp3 -acodec pcm-sl6le -ar 44100 -ac 2 输出文件.wav
4.从视频中提取帧
ffmpeg -i 输入文件.mp4 -vf fps=1/10 输出%d.png
5.调整视频大小:
ffmpeg -i 输入文件.mp4 -vf scale=1280:720 输出文件.mp4
6.连接视频:
ffmpeg -i "concat:输入文件1.mp4|输入文件2.mp4" -c copy 输出文件.mp4
ffplay.exe使用
ffplay是FFmpeg提供的一个用于播放音频和视频的简单命令行播放器。它支持几乎所有的音频和视频格式,并且可以在Windows、Linux和macOS等操作系统上运行。
ffplay 文件路径 //要播放名为example.mp4的视频文件 ffplay example.mp4
windows下编译安装ffmpeg
-
1.安装MSYS2:https://www.msys2.org/
-
2.更新MSYS2
在MSYS2shell中执行命令
pacman -Syu
- 3.安装编译工具和依赖项
执行命令来安装编译工具和FFmpeg的依赖项
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-yasm
pacman -S mingw-w64-x86_64-SDL2
pacman -S mingw-w64-x86_64-fdk-aac
pacman -S mingw-w64-x86_64-x264
pacman -S mingw-w64-x86_64-x265
pacman -S mingw-w64-x86_64-gcc
pacman -S make diffutils pkg-config git nasm
- 4.获取FFmpeg源代码
git clone https://git.ffmpeg.org/ffmpeg.git
- 5.准备好源码并新建两个目录
- 6.切换到目录
使用./configure命令配置选项
- 7.make工具编译安装
make -j8
make install
- 8.这个编译时间较长需要等待
代码介绍
-
libavcodec: 这个目录包含了FFmpeg中所有的解码器和编码器。
-
libavformat: 这个目录包含了FFmpeg中音视频格式的封装和解封装器。
-
libavutil: 这个目录包含了一些通用的工具函数和数据结构,被其他部分的代码广泛使用。
-
libswscale: 这个目录包含了图像缩放和颜色空间转换相关的代码。
-
libswresample: 这个目录包含了音频重采样相关的代码。
-
libavfilter: 这个目录包含了FFmpeg中的滤镜系统相关的代码。
-
libavdevice: 这个目录包含了FFmpeg中的设备支持相关的代码,如摄像头、音频设备等。
-
libpostproc: 这个目录包含了一些后处理相关的代码,例如视频去隔行、降噪等。
-
libavfilter: 这个目录包含了FFmpeg中的滤镜系统相关的代码。
-
fftools: 这个目录包含了一些工具程序,例如命令行工具ffmpeg、ffplay等。
FFMPEG中结构体很多。最关键的结构体可以分成以下几类:
-
AVFormatContext(flv,avi,rmvb,mp4)
:AVFormatContext是FFmpeg中最关键的结构体之一,它用于表示一个音视频格式的上下文。在解封装过程中,它包含了解封装器的状态信息,包括音视频的信息、封装格式的信息等。 -
AVCodecContext(h264,mpeg2,aac,mp3)
AVCodeContext是表示一个编解码器的上下文,包含了编解码器的状态信息和参数设置。它包括了编码器或解码器的所有必要信息,如编码/解码参数、编码/解码过程中的缓冲区等。 -
AVFrame(存数据)
AVFrame是用于表示一帧音视频数据的结构体,它包含了音视频帧的数据以及与该帧相关的元数据。在解码过程中,解码器将音视频数据解码为AVFrame格式进行处理,在编码过程中,编码器将AVFrame编码为特定格式的压缩数据。 -
AVPacket:AVPacket是表示一段音频数据的结构体,它包含了音视频数据的压缩编码数据以及与该数据相关的元数据。在解封装过程中,接封装器将音视频数据封装为AVPacket格式进行处理,在封装过程中,封装器将AVPacket格式进行处理,在封装过程中,封装器将AVPacket封装为特定格式的音视频流。
-
AVFilterContext:AVFilterContext是表示一个滤镜的上下文,它包含了滤镜的状态信息和参数设置。在滤镜
-
AVIOContext:AVIOContext(http,rtsp,rtmp,mms)
是用于表示音视频输入输出的上下文,它包含了音视频输入输出的状态信息和参数设置。在FFmpeg中,AVIOContext用于管理音视频数据的输入输出流,包括文件读写、网络传输等操作。
互相作用的流程图
开始
|
V
AVFormatContext
|
V
读取音视频文件
|
V
封装格式判断
|
V
音视频流提取
|
V
解码器选择
|
V
设置编解码参数
|
V
开始编解码过程
|
V
解码器解码
|
V
处理解码后的数据
|
V
结束