百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

流媒体开发学习2 打印ffmpeg一些配置

bigegpt 2024-09-10 11:19 4 浏览

一、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();
}


运行效果:


相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...