QT 使用ffmpeg 学习2 打印配置、协议、解码器、参数枚举

一、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

猜你喜欢

转载自blog.csdn.net/xundh/article/details/106019680