最近在研究ffmpeg,雷神的博客给了很大的帮助,可惜雷神走了。在雷神博客里面发现没有av_dump_format()这个函数,那就自己写篇文章来记录下。
av_dump_format是打印输入和输出格式的详细信息,声明位于libavformat/avformat.h下,如下所示
/**
* Print detailed information about the input or output format, such as
* duration, bitrate, streams, container, programs, metadata, side data,
* codec and time base.
*
* @param ic the context to analyze
* @param index index of the stream to dump information about
* @param url the URL to print, such as source or destination file
* @param is_output Select whether the specified context is an input(0) or output(1)
*/
void av_dump_format(AVFormatContext *ic,
int index,
const char *url,
int is_output);
这里的参数只需要注意两个一个是ic,一个是is_output。
ic:输入的AVFormatContext
is_output:如果是解封装的话是写输入0,需要输出话是写输出1
函数没有返回值。
#include <iostream>
using namespace std;
extern "C"
{
#include "libavformat/avformat.h"
#include "libavutil/avutil.h"
}
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
int main()
{
//解封装
cout << "Test Demux" << endl;
const char *url = "v1080.mp4";
//注册所有的 解封装 解码
av_register_all();
//初始化网络
avformat_network_init();
//解封装上下文
AVFormatContext *ic = NULL;
AVDictionary *opt = NULL;
av_dict_set(&opt, "rtsp_transport", "tcp", 0);
//设置网络延时
av_dict_set(&opt, "max_delay", "500", 0);
//返回0 代表成功
int ret = avformat_open_input(
&ic, //解封装上下文
url, //文件或网络地址
NULL, //设置NULL自动获取
&opt
);
//容错
if (ret != 0)
{
char buf[1024] = { 0 };
av_strerror(ret, buf, sizeof(buf) - 1);
cout << "open " << url << "failed " << buf << endl;
return -1;
}
cout << "open " << url << " success " << endl;
//打印输入或输出格式的详细信息
av_dump_format(ic, 0, NULL, 0);
//释放上下文 容错
if(ic)
{
avformat_close_input(&ic);
}
return 0;
}
接下来是代码运行之后,一个视频的详细信息:
可以发现 他视频的编码格式是h264,音频的编码格式是aac,还有一些其他信息。