本文ffmpeg的版本为当前最新的5.01版本,与网络上常见的2,3版本在函数和变量的使用上有较大差异。
首先往工程目录里放进去一个视频文件,这样方便在代码中进行路径书写(偷懒)。当然代码中的注释也会提示如何直接完整书写视频的路径。
#include<iostream>
extern "C"
{
#include "libavformat/avformat.h" //头文件不仅要在项目中鼠标点击配置,在代码中也要引入
}
using namespace std;
int main(int argc, char *argv[])
{
const char* path = "ds.mov";//记录视频源文件的路径,这里视频文件ds.mov直接放在项目工程里面了,所以可以直接用视频名称
//如果视频不在项目工程里面,路径的书写格式举例:D:\\code of visual studio\\ffmpegTest\\ffmpegTest\\ds.mov
//路径要使用“\\”,不然会被视为转义字符
cout << "TEST DEMUX" << endl;
//初始化封装库
//在新版本中av_register_all()被弃用了,可以根据代码里有无此函数判断ffmpeg版本
//初始化网络库(可以打开rtsp,rtmp,http协议的流媒体视频)
avformat_network_init();
//解封装上下文
AVFormatContext* ic = NULL;//将其地址做为输入,会申请一块空间,将这块空间的地址赋给ic
//解封装上下文AVFormatContext,是存储音视频封装格式中包含信息的结构体。
int re = avformat_open_input(&ic, path, 0, nullptr);//0表示自动选择解封装器,设置一个返回值知道有无错误
if (re != 0)//如果返回值不是0,说明打开出现错误
{
char buf[1024] = { 0 };
av_strerror(re, buf, sizeof(buf) - 1);//记录错误
cout << "open" << path << "failed!:" << buf << endl;//提示错误
return -1;
}
cout << "open " << path << " success!" << endl;//提示成功
return 0;
}
视频文件打开成功显示结果如上图所示。
实现打开视频的核心函数是:
int re = avformat_open_input(&ic, path, 0, nullptr);
该函数会根据文件路径path中的内容判断文件的格式(例程中为ds.mov),随后根据格式来选择使用何种Demuxer进行打开操作。如果视频文件的格式为flv,则Demuxer的选择为ff_flv_demuxer,因此后续对应的关键生命周期的方法read_header、read_pocket等都会使用该flv文件的Demuxer中函数指针指定的函数。