本章参考:
https://blog.csdn.net/leixiaohua1020/article/details/11693997
https://blog.csdn.net/leixiaohua1020/article/details/14214705
1.FFmpeg介绍
ffmpeg主要基于命令行来实现,进入网站https://ffmpeg.zeranoe.com/builds/下载,如下图所示:
- Static静态库 : 这个版本只包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三个可执行程序,没有头文件和库文件。
- Shared动态库 : 这个版本包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三个可执行程序和相关dll、lib等动态库文件。
- Dev开发库 : 这个包含了头文件和库文件。
- ffmpeg.exe: 用于转码的工具
- ffplay.exe: 用于播放的工具
- ffprobe.exe: 用于解析媒体文件格式的工具
由于我使用的QT库是MinGW_32bit版本的,所以需要下载32bit的ffmpeg.否则使用64bit的
在命令行使用中,我们只需要shared版本即可.
2.移植库到程序中
在实际开发中,我们需要下载Dev版本(开发者版本).
然后修改pro,导入Dev版本里的include文件和lib文件:
INCLUDEPATH +=F:/ffmpeg/win32/include
LIBS += -L F:/ffmpeg/win32/lib/ -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale
3.QT测试库完整性
由于ffmpeg是C写的,所以我们需要使用extern来声明ffmpeg头文件,代码如下:
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
extern "C"{
#include <libavcodec/avcodec.h>
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug() << "This FFmpeg Version Is : " << avcodec_version();
qDebug() << "This FFmpeg configuration Is : " <<avcodec_configuration();
return 0;
}
如果能够打印信息则说明ffmpeg可以正常使用了.
4.FFmpeg库简介
FFmpeg常用库如下:
- avcodec : 用于各种类型声音/图像编解码(最重要的库),该库是音视频编解码核心
- avformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 avcodec分析码流提供独立的音频或视频码流源
- avfilter : 滤镜特效处理, 如宽高比 裁剪 格式化 非格式化 伸缩。
- avdevice:各种硬件采集设备的输入输出。
- avutil:工具库,包括算数运算字符操作(大部分库都需要这个库的支持)
- postproc:用于后期效果处理;音视频应用的后处理,如图像的去块效应。
- swresample:音频采样数据格式转换。
- swscale:视频像素数据格式转换、如 rgb565、rgb888 等与 yuv420 等之间转换。
5.FFmpeg结构体对应关系
- AVFormatContext : 存储视音频封装格式(flv,mp4,rmvb,avi)中包含的所有信息
- AVInputFormat : 存在AVFormatContext ->iformat中, 保存视频/音频流的封装格式(flv、mkv、avi等),其中name成员可以查看什么格式
- AVStream: 视音频流,存在AVFormatContext->streamsi, 每个AVStream包含了一个流,一般默认两个(0为视频流,1为音频流).
- AVCodecContext: 存在AVFormatContext->streamsi ->codec中,保存解码器上下文结构体(保存解码相关信息,主要存储在程序运行时才能确定的数据),每个AVCodecContext包含了一个AVCodec解码器(比如h.264解码器、mpeg4解码器等),
- AVCodec : 存在AVCodecContext->codec中,指定具体的解码器(比如h.264解码器、mpeg4解码器等),。
- AVPacket : 解码前的音频/视频数据,通过av_read_frame()来获取一帧未解码的数据
- AVFrame : 解码后的音频/视频数据,比如解码视频数据则通过avcodec_receive_frame()来获取一帧AVFrame数据
- AVIOContext : 存在AVFormatContext ->pb中,用来存储文件数据的缓冲区,并通过相关标记成员来实现文件读写操作,其中的opaque 成员这是用于关联 URLContext 结构
- URLContext : 存在AVIOContext->opaque中,表示程序运行的当前广义输入文件使用的 context,着重于所有广义输入文件共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段.
- URLProtocol : 存在URLContext-> prot中,音视频输入文件类型(rtp,rtmp,file, rtmps, udp等),比如file类型的结构体初始化如下:
结构体定义参考:
2.AVFormatContext和AVInputFormat
3.AVPacket使用
4.FFMPEG-AVFrame