科百科
当前位置: 首页 范文大全

qt播放ffmpeg音频(流媒体开发学习1)

时间:2023-07-02 作者: 小编 阅读量: 1 栏目名: 范文大全

需要下载Shared和Dev,放在文件夹。=0){qDebug()<<"Couldn'topeninputstream.."<<endl;return;}//获取音频视频流数据信息if{qDebug()<<"Couldn'tfindstreaminformation."<<endl;return;}videoindex=-1;//nb_streams视音频流的个数,这里当查找到视频流时就中断了。

一、下载ffmpeg

https://ffmpeg.zeranoe.com/builds/

版本说明:

Static:这个版本只包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三个可执行程序,没有头文件和库文件。

Shared:这个版本包含了ffmpeg.exe、ffplay.exe、ffprobe.exe三个可执行程序和相关动态库文件。

Dev:开发版,这个包含了头文件和库文件。

需要下载 Shared和Dev,放在文件夹。static可以不下载。

二、新建 QT 项目 ffmpeg1

在.pro里添加lib和include路径:

QT= core guigreaterThan(QT_MAJOR_VERSION, 4): QT= widgetsTARGET = ffmpeg1TEMPLATE = appSOURCES= main.cpp\widget.cppHEADERS= widget.hFORMS= widget.uiINCLUDEPATH="D:\\Documents\\FFMpeg\\dev\\include"LIBS= -LD:\Documents\FFMpeg\dev\lib -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale

把shared里bin内容拷贝到exe目录下:

添加两个控件三、实现一个播放器的功能

代码仓库: https://gitee.com/xundh/QT-Study/tree/master/sample5_ffmpeg1

#include "widget.h"#include "ui_widget.h"#include <QTime>#include <QDebug>extern "C"{#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libswscale/swscale.h>#include <libavutil/imgutils.h>}Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);}Widget::~Widget(){delete ui;}void Delay(int msec){QTime dieTime = QTime::currentTime().addMSecs(msec);while(QTime::currentTime() < dieTime)QCoreApplication::processEvents(QEventLoop::AllEvents,100);}void Widget::on_pushButton_clicked(){AVFormatContext *pFormatCtx;int i,videoindex;AVCodecContext *pCodecCtx;AVCodec *pCodec;AVFrame *pFrame , *pFrameRGB;unsigned char *out_buffer;AVPacket *packet;int ret,got_picture;struct SwsContext *img_convert_ctx;char filepath[] = "D:/1.mp4";// 初始化编解码库av_register_all(); // 创建AVFormatContext对象,与码流相关的结构pFormatCtx = avformat_alloc_context();// 初始化pFormatCtx结构if (avformat_open_input(&pFormatCtx, filepath, NULL, NULL) != 0){qDebug() << "Couldn't open input stream. . " << endl;return;}// 获取音频视频流数据信息if(avformat_find_stream_info(pFormatCtx,NULL)<0){qDebug() << "Couldn't find stream information. " << endl;return;}videoindex = -1;// nb_streams视音频流的个数,这里当查找到视频流时就中断了。for(int i=0;i<pFormatCtx->nb_streams;i){if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO){videoindex=i;break;}}if(videoindex==-1){qDebug() << "Didn't find a video stream. " << endl;return;}// 获取视频流编码结构pCodecCtx = pFormatCtx->streams[videoindex]->codec;// 查找解码器pCodec = avcodec_find_decoder(pCodecCtx->codec_id);if(pCodec==NULL){qDebug() << "codec not found." << endl;return;}// 用于初始化pCodecCtx结构if(avcodec_open2(pCodecCtx,pCodec,NULL)<0){qDebug() << "Could not open codec. " << endl;return;}// 创建帧结构,此函数仅分配基本结构空间,图像数据空间需通过av_malloc分配 。pFrame = av_frame_alloc();pFrameRGB = av_frame_alloc();// 创建动态内存,创建存储图像数据的空间// av_image_get_buffer_size 获取一帧图像需要的大小out_buffer = (unsigned char*)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_RGB32, pCodecCtx->width, pCodecCtx->height,1));av_image_fill_arrays(pFrameRGB->data,pFrameRGB->linesize,out_buffer,AV_PIX_FMT_RGB32, pCodecCtx->width,pCodecCtx->height, 1);packet = (AVPacket*)av_malloc(sizeof(AVPacket));// Output InfoqDebug() << "------------ File Information -------------" << endl;// 此函数打印输入或输出的详细信息av_dump_format(pFormatCtx, 0, filepath, 0);qDebug() << "----------------" << endl;// 初始化img_convert_ctx结构img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,pCodecCtx->pix_fmt,pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_RGB32, SWS_BICUBIC, NULL, NULL, NULL);// av_read_frame读取一帧未解码的数据while(av_read_frame(pFormatCtx,packet)>=0){// 如果是视频数据if (packet->stream_index==videoindex){// 解码一帧视频数据ret = avcodec_decode_video2(pCodecCtx,pFrame, &got_picture, packet);if(ret<0){qDebug() << "Decode error" << endl;return;}if(got_picture){sws_scale(img_convert_ctx, (const unsigned char* const*)pFrame->data,pFrame->linesize, 0, pCodecCtx->height,pFrameRGB->data, pFrameRGB->linesize);QImage img((uchar*)pFrameRGB->data[0],pCodecCtx->width,pCodecCtx->height, QImage::Format_RGB32);ui->label->setPixmap(QPixmap::fromImage(img));Delay(40);}}av_free_packet(packet);}sws_freeContext(img_convert_ctx);av_frame_free(&pFrameRGB);av_frame_free(&pFrame);avcodec_close(pCodecCtx);avformat_close_input(&pFormatCtx);}

四、错误处理‘UINT64_C’ was not declared in this scope

error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROSD:\Documents\FFMpeg\dev\include\libavutil\common.h:205: error: 'UINT64_C' was not declared in this scopeif ((a 0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF);^

解决方法:

libavutil/common.h 顶部增加如下代码

#ifdef __cplusplus#define __STDC_CONSTANT_MACROS#ifdef _STDINT_H#undef _STDINT_H#endif# include "stdint.h"#endif#ifndef INT64_C#define INT64_C(c) (c ## LL)#define UINT64_C(c) (c ## ULL)#endif

    推荐阅读
  • 棉麻面料选择(棉麻面料有哪些优点)

    而棉麻混合面料有效避免了麻和棉各方的缺点,两者优劣互补,成为夏季衣服的最佳选择。当然不可否认随意的褶皱正是棉麻的气质。未经洗涤过的面料如果比较柔顺,无粗糙感,不一定是亚麻,或亚麻面料含量低于30%。优质亚麻面料,或含亚麻成分高的面料,未经多次洗涤过,其触摸上去的手感会比较粗糙,多洗涤几次后就会变的柔顺。

  • 消失35年的飞机突然出现的真相(失踪35年的飞机重新出现)

    泛美航空公司赔偿了飞机上57名乘客的死亡保险,然而在35年后,事情出现了离奇的转折!结果在众目睽睽之下,这让道格拉斯DC-4客机914航班再一次起飞消失在了空中。泛美航空在倒闭之前为世界的航空业做出了很多突出的贡献,比如它的喷射客机、珍宝客机以及电脑定位系统。曾几何时,泛美航空垄断了超过一半从美国飞往其他国家的国际航班。对,是国际航班。因为泛美航空已经不在了,泛美航空的914航班也算是死无对证了。

  • 只有一个手机号怎么注册两个微信(一个手机号如何注册两个微信)

    以下内容大家不妨参考一二希望能帮到您!短信发送成功之后,微信会提示该手机号已经绑定过其他微信号,选择不是我的继续注册;按照提示继续操作,进行安全校验;验证通过,按照提示发送短信即可。

  • 描写雪的作文(一起来看看吧)

    以至于很多人都没有发现它的踪影,因为那时雪不大,只有仔细地听,才能听到一点儿“沙沙”声,雪又那么小,几乎看不见,需要很专心地感受才能发现它的痕迹。我就是那个“蓑笠翁”,一人独享那白雪皑皑的美景。但他们却可以迅速地抛开失望,去“迎接”下一次喜悦……我也学着他们的样子去“迎接”雪花。

  • 明日之后怎么合住(明日之后的合租方法)

    以下内容希望对你有帮助!明日之后怎么合住合租需要两个人一起回到庄园才可以进行邀请。打开庄园管理器,主人邀请进行合租,待对方同意后,合租关系就确认了。解除合租有2天的等待期,2天过后才能解除合作,所以邀请室友需谨慎。房主可以设置合租者的权限,包括基础建造、家具和农田的使用权。两人的房屋在一定范围以内,则额外获得远程资源消耗权,身在对方的庄园内也能使用存放在自己庄园的资源。

  • 腊月二十三是灶王爷的生日吗(今日八月初三灶王爷生日)

    玉皇大帝念他是自己的本家,便封他为灶王。新来的御厨,做的食物总不合玉帝胃口。旧时,家家户户都设有灶王爷的神位,认为他负责管理各家的灶火,当然,人们世代对于灶神的祭祀也是少不了的。尤其是八月初三是“灶王爷”的诞辰日,也正值秋季丰收,家家户户都免不了在灶台上祭拜灶神,希望家里的生活越来越好,期盼粮食也能够大丰收,这样锅灶里每天都能闻到饭香菜香。

  • 战狼3演员表介绍(战狼3的简单介绍)

    战狼3演员表介绍《战狼3》将由吴京和余男主演,目前尚未开拍,其他主演尚未确定出演,此前一直有传闻彭于晏会出演这部影片。此前吴京曾在采访中透露过在《战狼》没开拍之前,就已经有三部的剧本了,而如今只拍到第二部,所以第三部是一定要拍的,第三部中冷锋的龙小云的感情,也会给观众一个交代。吴京,1974年4月3日出生于北京市,毕业于北京体育大学,中国影视男演员、电影导演,中国电影家协会副主席。

  • 小学生数学加减乘除运算口诀(小学数学加减乘除法则儿歌及附练习)

    和不满十落原位,满十上位要进一。凑十余数落下来,加到哪位落哪位。进位加数加一起,结果不差半分厘。大减小时落下差,小减大时去借位。借一来十减后加,加减结果落原位,连续借位要细心,借走剩几要牢记。十位数乘得若干十,积的末位对十位。计算准确对好位,两次乘积加一起。多位数乘法法则整数乘法低位起,几位数乘法几次积。

  • 手机支付有危险怎么不再提示(手机支付新骗局)

    万一真的发现被诈骗,转账24小时内向警方报案后,可在支付宝申请撤回交易,尽量避免资金损失。除了支付宝微信也有类似的风险提醒功能当你收到如下图所示的风险提醒或拦截时,很可能正身处骗局之中。重点来了支付宝如何设置“延迟到账”?需要立刻做如下几件事:挂失并且冻结SIM卡、微信、支付宝、网银等。

  • 一加ace2买啥颜色好(大卖的一加Ace2让谁眼红)

    一加Ace2这款新机的持续火爆,确实也进一步让2K-3K段位的不少友商机型开始做出调整,手机厂商之间的良性竞争,本身不管是对行业进步还是消费者来说都是有益的,不过近期却发现疑似大批水军集中发稿抹黑一加Ace2,其中的内容却出奇一致的指向了一加Ace2的“绿屏”。其实说到一加Ace2的屏幕,其搭载的国产天马的1.5K屏素质本身相当不错,就像很多首批用户说的那样,观感细腻舒适,配合120Hz高刷新率也足够丝滑。