php网站开发套模板步骤,个人公众号开发php,用微信小程序赚100万,推广自己产品的文案前言
参考了雷神的自制播放器项目#xff0c;100行代码实现最简单的基于FFMPEGSDL的视频播放器#xff08;SDL1.x#xff09;
不过老版本的代码参考意义不大了#xff0c;我现在准备使用Qt VS2022 FFmpeg59重写这部分代码#xff0c;具体的代码仓库如下#xff1a;
…前言
参考了雷神的自制播放器项目100行代码实现最简单的基于FFMPEGSDL的视频播放器SDL1.x
不过老版本的代码参考意义不大了我现在准备使用Qt VS2022 FFmpeg59重写这部分代码具体的代码仓库如下
LeventureQys/MediaPlay-FFmpeg
开发环境 Visual Studio 2022 Qt 5.14.2 FFmpeg 59
本文任务
调通编译环境打印协议支持信息、AVFormat信息、AVCodec 支持信息、AVFilter信息、配置信息等提供一个通用的调试框架
流程
1. 开发环境准备
首先我们Visual Studio 2022 qt是准备好的这里不做过多介绍了。 这里简单说说我在做这一块的时候为什么没有选择用雷神已经写好的代码和库来进行开发因为老版ffmpeg对新的项目支持比较差而且是32位的不兼容64位的qt而且老版本的c兼容对新版的编译器有很多问题所以我在多次尝试没法正常使用VS 2022 qt完成雷神的代码编译之后就放弃了准备用新版的ffmpeg来进行一些编写而且实际上新版的接口更合理不过有一些改动需要稍微查一下。总的来说流程是一回事。
下载FFmpeg的build : FFmpeg-Builds - Public
压缩包里的内容如下 其中include是头文件lib是链接文件bin是dll文件
具体链接和include这里就不谈了很简单随便配配就行了
2. 具体代码
在导入头文件的时候需要注意是以这种形式导入
下面的#pragma comment (lib, “”) 是选配的你可以在代码中写也可以在工程中预备配置好
需要注意的是新版本的迭代器和老版本的不太一样现在这个是自制了一个void*类型来作为迭代器使用的所以需要注意
//Windows
extern C
{
#include libavcodec/avcodec.h
#include libavformat/avformat.h
#include libavfilter/avfilter.h
};extern C
{
#pragma comment (lib, Ws2_32.lib)
#pragma comment (lib, avcodec.lib)
#pragma comment (lib, avdevice.lib)
#pragma comment (lib, avfilter.lib)
#pragma comment (lib, avformat.lib)
#pragma comment (lib, avutil.lib)
#pragma comment (lib, swresample.lib)
#pragma comment (lib, swscale.lib)
};我这里做了一个BaseInfos类内容就是返回这几个特定信息的QString内容如下
BaseInfo.h
#pragma once#include QObject
/// summary
/// 这个类用于获得所有的ffmpeg信息
/// /summary
///
#include PublicHeader.h
//FIX
struct URLProtocol;class BaseInfos : public QObject
{Q_OBJECTpublic:BaseInfos(QObject* parent nullptr);/// summary/// 协议支持信息/// /summary/// returns输入内容和输出内容/returnsQString getProtocolInfo();/// summary/// 获得AVFormat信息/// /summary/// returns/returnsQString getAVFormatInfo();/// summary/// 获得AVCodec 支持信息/// /summary/// returns/returnsQString getAVCodedInfo();/// summary/// 获得AVFilter信息/// /summary/// returns/returnsQString getAVFilterInfo();/// summary/// 获得配置信息/// /summary/// returns/returnsQString getConfigurationInfo(); ~BaseInfos();
};
BaseInfos.cpp
#include BaseInfos.hBaseInfos::BaseInfos(QObject* parent): QObject(parent)
{}QString BaseInfos::getProtocolInfo()
{//初始化一个info字符串char info[10000] { 0 };avformat_network_init();struct URLProtocol* pup nullptr;//inputstruct URLProtocol** p_temp pup;avio_enum_protocols((void**)p_temp, 0);while ((*p_temp) ! nullptr) {sprintf(info, %s[ProtocolInfo - In ][%10s]\n, info, avio_enum_protocols((void**)p_temp, 0));}pup nullptr;//outputavio_enum_protocols((void**)p_temp, 1);while ((*p_temp) ! nullptr) {sprintf(info, %s[ProtocolInfo - Out][%10s]\n, info, avio_enum_protocols((void**)p_temp, 1));}QString ret QString::fromUtf8(info, 10000);return ret;
}QString BaseInfos::getAVFormatInfo()
{// 初始化一个info字符串char info[10000] { 0 };avformat_network_init();const AVInputFormat* input_format nullptr;const AVOutputFormat* output_format nullptr;// 输入while ((input_format av_demuxer_iterate((void**)input_format)) ! nullptr) {sprintf(info, %s[getAVFormatInfo - In ] %10s\n, info, input_format-name);}// 输出while ((output_format av_muxer_iterate((void**)output_format)) ! nullptr) {sprintf(info, %s[getAVFormatInfo- Out] %10s\n, info, output_format-name);}QString ret QString::fromUtf8(info, 10000);return ret;}QString BaseInfos::getAVCodedInfo()
{char info[50000] { 0 };avformat_network_init();const AVCodec* codec_temp nullptr;void* opaque nullptr;codec_temp av_codec_iterate(opaque);while ((codec_temp av_codec_iterate(opaque)) ! nullptr) {const AVCodec* decoder avcodec_find_decoder(codec_temp-id);if (decoder ! nullptr) {sprintf(info, %s[getAVCodedInfo -Dec], info);}else {sprintf(info, %s[getAVCodedInfo - Enc], info);}switch (codec_temp-type) {case AVMEDIA_TYPE_VIDEO: {sprintf(info, %s[getAVCodedInfo - Video], info);break;}case AVMEDIA_TYPE_AUDIO: {sprintf(info, %s[getAVCodedInfo - Audio], info);break;}default: {sprintf(info, %s[getAVCodedInfo - Other], info);break;}}}return QString::fromUtf8(info,50000);}QString BaseInfos::getAVFilterInfo()
{char info[10000] { 0 };avformat_network_init();const AVFilter* filter nullptr;void* opaque nullptr;filter av_filter_iterate(opaque);while ((filter av_filter_iterate(opaque)) ! nullptr) {sprintf(info, %s[%10s]\n, info, filter-name);}QString ret QString::fromUtf8(info);return ret;
}QString BaseInfos::getConfigurationInfo()
{char info[10000] { 0 };avformat_network_init();sprintf(info, %s\n, avcodec_configuration());return QString::fromUtf8(info);
}BaseInfos::~BaseInfos()
{}
3.效果