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

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

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

需要下载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

    推荐阅读
  • 关爱儿童志愿服务项目(全球通蓝色梦想公益项目筑梦新起航)

    2020年10月,中国移动全球通品牌在国家乡村振兴局的关心指导下,联合教育部、中国教育发展基金会、中国移动慈善基金会,正式发布“全球通蓝色梦想公益项目”,支持乡村基础教育发展。小朋友们的梦想画作2022年,广受欢迎的“全球通·筑梦行”系列公益活动也将继续在全国多地展开,公益项目会在全国范围内招募“全球通公益合伙人”。2021年“全球通·筑梦行”公益活动现场教育是立国之本,人才是国之重器。

  • 郭沫若的代表作品有特点(郭沫若的代表作)

    在中国近代,随着西方先进思想的涌入,国民的思想也随之解放,又一次兴起了诗歌创作的高潮。而郭沫若的这首《天狗》就是在他日本留学期间所创作的。毫无疑问的是,虽然郭沫若的这首《天狗》风格迥异,但是其间的内涵却是有着划时代的意义,或许这就是它被选入课本的最主要原因。当郭沫若最初将这首《天狗》寄回国内的好友白宗华手里的时候,好友对他连连称赞,随即就将它发表在报刊上,很快就引发了一时的轰动。

  • 杀死癌细胞最狠的野菜 杀死癌细胞最狠的野菜图片

    最近几年癌症发病率不断升高,每年都有很多人因癌症而失去生命,据说健康人体内也有癌细胞存在,如果不能及时把它们消灭,就会不断繁殖,到达一定程度后就会导致人体细胞癌变,会严重危害人类身体健康。平时人们多吃红苋菜能防癌抗癌降低癌症发病率,除此以外,它还是一种能补血活血的重要存在,它能提高人体造血功能也能预防缓解贫血。

  • 鲁迅眉冷对千夫指事例(横眉冷对千夫指的鲁迅)

    3月27日,蒋桂战争爆发。28日,南京政府向日本妥协,济南事件结案。5月5日,粤桂爆发战争。5月中旬,蒋、冯开战。8月1日,上海成立反帝大同盟。8月30日,革命先驱彭湃被国民党杀害。而鲁迅曾在遗嘱中表示,“希望后代万不可做空头文学家”。因此,周海婴的身上难免承担着两大家族延续香火、开枝散叶的神圣使命。儿子的病一但犯起来,呼吸困难,彻夜难眠。周海婴对送来的留声机不满意,鲁迅竟一连给他换了三次。

  • 土豆炖驴肉的简单做法(土豆炖驴肉怎么做好吃)

    下面内容希望能帮助到你,我们来一起看看吧!土豆炖驴肉的简单做法切土豆:把土豆洗干净切成块,泡入水中,可以让土豆口感更好;备用。切驴肉,驴肉切成小块,放入盘中,加入胡椒粉、盐和腌制。锅里放少许油,因为驴肉在炒的过程中会出油,所以避免粘锅放一些即可。待油热,放入驴肉翻炒,翻炒过程尽量让驴肉把油脂炒出来,可以增加驴肉的鲜美度。水差不多已经顿干,土豆已经熟了,可以关火,出锅。

  • 去掉脸部皱纹(去掉脸部皱纹方法)

    下面更多详细答案一起来看看吧!去掉脸部皱纹可以采用微整的方法,比如注射肉毒素,皱纹就会慢慢消失。另外也可以使用填充法,填充玻尿酸。可以购买一些功效性的面霜。在涂抹面霜的时候,用手做按摩,疏通脸部的血管。一般有皱纹可能是由于年龄老化或者是脸部缺水,平常可以多敷一些补水的面膜。

  • 我的世界简单又好玩的指令(我的世界迷路了怎么回家)

    我的世界简单又好玩的指令?以下内容希望对你有帮助!我们可以在家里看看云是往哪里飘的,然后在找不到回家的道路时,抬头看看云,就知道家在哪个地方,也能够顺利地回家了。

  • 专家谈学前教育(优质学前教育怎么搞)

    波兰法律规定,私立幼儿园与公立幼儿园按相同的法规运行,按统一的标准接受监督。波兰华沙第52幼儿园园长科尔杰斯卡表示,幼儿教育处于孩子成长关键期,关系到许多家庭。为解决民众育幼难题,优化社会人口结构,新加坡政府近年来大力鼓励生育,同时增建公立幼儿园。随着双职工家庭数量的增加,韩国家庭的婴幼儿养育负担日益加重。此外,韩国政府对托儿所学费实行补贴,双职工家庭等可获得全额补贴。

  • 锦心似玉体面夫妇是什么意思 锦心似玉为何叫体面夫妇

    元娘临终前仍不忘面面俱到交代后事,她让徐令宜娶妹妹十一娘的目的,就是为了让十一娘在徐家代替她照顾谆哥。后来网友期待两人能够赶紧圆房,于是“体面”一词,又成了徐令宜和十一娘发糖、圆房的代名词。到此,终于弄明白了“体面”的意思,其实就是圆房,徐令宜和十一娘在大婚当晚并没有行周公之礼,徐令宜也因此耿耿于怀。