一、Ffmpeg说明
- 协议层:该层处理流媒体协议的数据解析与封装,包括http,rtmp,rtsp,file等
- 容器层:该层处理多媒体容器的解析和封装,包括mp4,flv,mkv等
- 编解码层:该层负责音视频编解码,包括h264,h265,mp3,aac等
- 原始数据层:该层负责原始音视频数据的处理,如视频像素格式转换,缩放,裁剪,过滤,音频重采样,过滤等,处理对象是pcm,yuv,rgb等原始数据。
- 设备层:负责音视频播放及采集
ffmpeg 库说明
- livavformat 作用于协议层和容器层,依赖于libavcodec。
- libavcodec 作用于编解码层。
- ibswscale,libswresample,libavfilter作用于原始数据层。
- libavdevice 作用于设备层。
- livavutil 是基础公共模块,上面各个类库都会依赖于它。
二、打印一些配置值的代码实现
1. 新建QT控制台项目
设置 ffmpeg 库
QT += core
QT -= gui
TARGET = ffmpeg2
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH +="D:\\tools\\ffmpeg\\win32\\dev\\include"
LIBS += -LD:\tools\ffmpeg\win32\dev\lib -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale
2. 修改main
#include <QCoreApplication>
#include <QDebug>
#define __STDC_CONSTANT_MACORS
#ifdef _WIN32
//windows
extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavfilter/avfilter.h"
}
#else
//linux
#ifdef __cplusplus
extern "C"
{
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfilter.h>
#ifdef __cplusplus
};
#endif
#endif
//FIX
struct URLProtocol;
/**
* @brief urlprotocolinfo protocol support information
* @return
*/
char * urlprotocolinfo(){
char *info=(char*)malloc(40000);
memset(info,0,40000);
av_register_all();
struct URLProtocol *pup = NULL;
// Input
struct URLProtocol **p_temp = &pup;
avio_enum_protocols((void **)p_temp,0);
while((*p_temp)!=NULL){
sprintf(info, "%s[In ][%10s]\n", info, avio_enum_protocols((void **)p_temp, 0));
}
pup = NULL;
// output
avio_enum_protocols((void**)p_temp,1);
while((*p_temp)!=NULL){
sprintf(info, "%s[Out][%10s]\n", info, avio_enum_protocols((void **)p_temp, 1));
}
return info;
}
char * avformatinfo(){
char * info=(char*)malloc(40000);
memset(info,0,40000);
av_register_all();
AVInputFormat *if_temp = av_iformat_next(NULL);
AVOutputFormat *of_temp = av_oformat_next(NULL);
// INPUT
while(if_temp!=NULL){
sprintf(info, "%s[In ] %10s \n",info,if_temp->name);
if_temp = if_temp->next;
}
while(of_temp!=NULL){
sprintf(info, "%s[Out ] %10s \n" , info,of_temp->name);
of_temp = of_temp->next;
}
return info;
}
/**
* @brief avcodecinfo AVCodec support information
* @return
*/
char * avcodecinfo(){
char *info=(char *)malloc(40000);
memset(info,0,40000);
av_register_all();
AVCodec *c_temp = av_codec_next(NULL);
while(c_temp!=NULL){
if (c_temp->decode!=NULL){
sprintf(info, "%s[Dec]", info);
}
else{
sprintf(info, "%s[Enc]", info);
}
switch (c_temp->type){
case AVMEDIA_TYPE_VIDEO:
sprintf(info, "%s[Video]", info);
break;
case AVMEDIA_TYPE_AUDIO:
sprintf(info, "%s[Audio]", info);
break;
default:
sprintf(info, "%s[Other]", info);
break;
}
sprintf(info, "%s %10s\n", info, c_temp->name);
c_temp=c_temp->next;
}
return info;
}
/**
* AVFilter Support Information
*/
char * avfilterinfo()
{
char *info=(char *)malloc(40000);
memset(info,0,40000);
avfilter_register_all();
AVFilter *f_temp = (AVFilter *)avfilter_next(NULL);
while (f_temp != NULL){
sprintf(info, "%s[%15s]\n", info, f_temp->name);
f_temp=f_temp->next;
}
return info;
}
/**
* Configuration Information
*/
char * configurationinfo()
{
char *info=(char *)malloc(40000);
memset(info,0,40000);
av_register_all();
sprintf(info, "%s\n", avcodec_configuration());
return info;
}
int main(int argc, char *argv[])
{
qDebug() << "Hello begining" <<endl;
QCoreApplication a(argc, argv);
char *infostr=NULL;
infostr = configurationinfo();
qDebug() << " <<Configuration>> " << infostr << endl;
free(infostr);
infostr = urlprotocolinfo();
qDebug() << " <<URLProtocol>> " << infostr << endl;
free(infostr);
infostr = avformatinfo();
qDebug() << " <<AVFormat>> " << infostr << endl;
free(infostr);
infostr = avcodecinfo();
qDebug() << " <<AVCodec>> " << infostr << endl;
free(infostr);
infostr=avfilterinfo();
qDebug() << " <<AVFilter>> " << infostr << endl;
free(infostr);
return a.exec();
}
参考:
https://www.jianshu.com/p/5398ef71ebd5
https://blog.csdn.net/weixin_37897683/article/details/81231047