本文ffmpeg的版本为当前最新的5.01版本,与网络上常见的2,3版本在函数和变量的使用上有较大差异。
首先往工程目录里放进去一个视频文件,这样方便在代码中进行路径书写(偷懒)。当然代码中的注释也会提示如何直接完整书写视频的路径。
#includeextern "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中函数指针指定的函数。



