公司法
当前位置: 首页 法律大全

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

    推荐阅读
  • 怎样烧红烧肉(家常红烧肉的做法)

    怎样烧红烧肉原料:精品五花肉、炖肉料包、葱、冰糖、茶叶。五花肉切条放入凉水中撇去血沫。焯水定型;捞出后晾凉切一样大的方块。锅中放少许油倒入白砂糖炒糖色。糖色的气泡由大变小迅速关火,倒入开水。加少许绍酒,加开水烧,熟得快,加入茶叶水,可以去腥味。改回炒锅大火,放冰糖,使汁粘稠即可出锅,香葱段点缀。

  • 2022杭州径山茶圣节时间、地点、活动一览

    最终集齐所有铜币的游客可至“大宋钱庄”兑换神秘礼物。今来茶韵生活01、陆羽说论坛为进一步挖掘径山茶宴有关历史文化,本届茶圣节特邀请茶学专家交流讨论如何更好保护和传承国家非物质文化遗产。为打造文化传播年,第二十一届中国茶圣节以春迎、夏凉、秋韵、冬福四大主题贯穿全年。

  • 《重生之门》给罗队发短信的人身份

    但是通过前文,不难推测应该是庄文杰发给罗队的短信,只是没有暴露自己的身份。罗坚来到青檀假日酒店排查,没有发现任何异常,庄文杰和许正清乔装改扮随后赶来,他们一出现就被人盯上,庄文杰和许正清来到地下停车场,庄文杰巧妙引开那些人,混进游客中进入酒店。这件事情把十二年前的洛神案串联起来了。

  • 爱情名著哪个好看(随侃名著佳作第6期)

    言下之意,他主动向周晓白提出分手。钟跃民成为一个军人,上了战场,并且是在战斗中受伤,被送到战地医疗帐篷内救治。而周晓白和钟跃民在时隔十多年后的相遇一刻,也是被编剧以及导演,安排得相当的特别,并不是那种悲情欲绝又或者是感动无比的相遇时刻。

  • 板栗可以保存多久 板栗怎么能保存时间长

    如果是晒干的板栗可以存放3-4个月,生板栗在常温下合理贮存可以存放1-2个月,煮熟的栗子大概可以放一周,熟板栗放冰箱冷冻能保存30天左右,熟板栗放冰箱冷藏保存可以存放5天。

  • 贾宝玉与红楼梦的关系(贾宝玉的春梦到底在暗示什么)

    贾宝玉与红楼梦的关系?要知道,贾琏这个人极其好色,而且好的就是熟女,那么从这个曲折的描述中,我们可以推断出,秦可卿应该是那种熟女中的极品。这个问题在书中得不到直接的答案,因为在后面的文章中,秦可卿一共只出现三个镜头:介绍弟弟秦钟与贾宝玉相见,秦可卿病后王熙凤带贾宝玉去探病,秦可卿临死前在梦里向王熙凤交代后事。

  • 简单又好看的剪纸适合儿童(孩子能学会的幼儿简单剪纸教程)

    接下来我们就一起去研究一下吧!简单又好看的剪纸适合儿童幼儿园的孩子经常要做各种各样的手工,通过做手工,提高孩子的审美能力,锻炼孩子的动手能力,培养孩子的专注力和耐心,让孩子更聪明。用蓝天白云绿色的草地,太阳、小兔子和小蘑菇,可以贴出一幅画,也可以用这个画面编出一个小故事,带孩子度过愉快的亲子时光。欢迎关注,学习更多幼儿小手工。

  • 摩尔庄园钓鲤鱼的最佳方法(摩尔庄园钓鲤鱼的有什么最佳方法)

    以下内容希望对你有帮助!摩尔庄园钓鲤鱼的最佳方法工具/原料:华为手机、安卓系统、摩尔庄园游戏。进入游戏后操纵游戏角色进行移动了。去商店购买钓鱼的诱饵。来到池塘边进行的钓鱼。等待的水面出现波动即可钓到鲤鱼了。

  • 国外的懒人产品(歪国产品咖在用哪些可爱的小工具)

    quotes=trueUsabilityHub我通常使用UsabilityHub来帮助确定设计方案。

  • 一年四季水果时间表(一年四季的时令水果是什么)

    3月(春季):枇杷、红香蕉、樱桃、杨桃、番荔枝、青枣、甘果蔗、草莓、番石榴、牛奶蕉、柑桔、观赏南瓜、果桑、鹤首瓜。12月(冬季):樱桃、番茄、红香蕉、鸡蛋果、木瓜、草莓、百香果、杨桃、无花果、番石榴、牛奶蕉、鹤首瓜、观赏南瓜、果蔗、台湾青枣、黑提子、人心果、柠檬、菠萝、油梨、柑橘、橙子。