千家信息网

Qt如何实现ffmpeg音频播放

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要为大家展示了"Qt如何实现ffmpeg音频播放",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Qt如何实现ffmpeg音频播放"这篇文章吧。一、
千家信息网最后更新 2025年12月03日Qt如何实现ffmpeg音频播放

这篇文章主要为大家展示了"Qt如何实现ffmpeg音频播放",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Qt如何实现ffmpeg音频播放"这篇文章吧。

一、前言

之前用ffmpeg解码出来了音频,只是做了存储部分,比如存储成aac文件,播放的话早期用的是sdl来播放音频,自从Qt5以后提供了QAudioOutput来播放输入的音频数据,就更加方便了,可以直接将解码好的音频数据写入就能播放了,这些就少了个学习sdl的成本,而且和Qt就更加融合,不需要额外的第三方库,解码好的视频,其实就是一张张图片数据,可以直接用QPainter绘制或者QOpenGlWidget通过GPU显示,解码好的音频用QAudioOutput播放,这对于很多初学者来说,是个很好的消息,完美。

音频播放大致的流程如下:

  1. 初始化格式QAudioFormat,设置对应的属性。

  2. 初始化一个QAudioOutput音频播放对象。

  3. 将QAudioOutput启动后的播放设备交给QIODevice。

  4. 打开音频流后初始化SwrContext用来转换音频数据。

  5. 循环解码音频数据后调用swr_convert转换音频数据。

  6. 将转换好的音频数据直接write到QIODevice。

二、功能特点

  1. 多线程实时播放视频流+本地视频+USB摄像头等。

  2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。

  3. 多线程显示图像,不卡主界面。

  4. 自动重连网络摄像头。

  5. 可设置边框大小即偏移量和边框颜色。

  6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。

  7. 可设置两种OSD位置和风格。

  8. 可设置是否保存到文件以及文件名。

  9. 可直接拖曳文件到ffmpegwidget控件播放。

  10. 支持h365视频流+rtmp等常见视频流。

  11. 可暂停播放和继续播放。

  12. 支持存储单个视频文件和定时存储视频文件。

  13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。

  14. 可设置画面拉伸填充或者等比例填充。

  15. 可设置解码是速度优先、质量优先、均衡处理。

  16. 可对视频进行截图(原始图片)和截屏。

  17. 录像文件存储支持裸流和MP4文件。

  18. 支持qsv、dxva2、d3d11va等硬解码。

  19. 支持opengl绘制视频数据,极低CPU占用。

  20. 支持嵌入式linux,交叉编译即可。

三、效果图

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo

  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo

  3. 个人主页:https://blog.csdn.net/feiyangqingyun

  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

void FFmpegThread::initAudioDevice(int sampleRate, int sampleSize, int channelCount){#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))    QAudioFormat format;    format.setCodec("audio/pcm");    format.setSampleRate(sampleRate);    format.setSampleSize(sampleSize * 8);    format.setChannelCount(channelCount);    format.setSampleType(QAudioFormat::SignedInt);    format.setByteOrder(QAudioFormat::LittleEndian);    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());    audioDeviceOk = info.isFormatSupported(format);    if (audioDeviceOk) {        audioOutput = new QAudioOutput(format);        audioDevice = audioOutput->start();    } else {        qDebug() << TIMEMS << "Raw audio format not supported by backend, cannot play audio.";    }#endif}void FFmpegThread::freeAudioDevice(){#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))    audioOutput->stop();    audioOutput->deleteLater();#endif}void FFmpegThread::decodeAudio(){    //没有启用解码音频    if (!playAudio) {        return;    }    //保存音频流数据到文件    saveFileAac();    //设备不正常则不解码    if (!audioDeviceOk) {        return;    }    //解码音频流    frameFinish = avcodec_decode_audio4(audioCtx, audioFrame, &frameFinish, tempPacket);    if (frameFinish) {        int result = swr_convert(audioSwrCtx, &audioData, audioFrame->nb_samples, (const uint8_t **)audioFrame->data, audioFrame->nb_samples);        if (result) {            int outsize = av_samples_get_buffer_size(NULL, audioCtx->channels, audioFrame->nb_samples, AV_SAMPLE_FMT_S16, 0);            audioDevice->write((char *)audioData, outsize);        }    }}

以上是"Qt如何实现ffmpeg音频播放"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

音频 数据 文件 视频 支持 可设 存储 内容 图片 标签 站点 篇文章 视频流 学习 主页 位置 线程 设备 边框 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 我的世界租服务器如何加mod 智能售货机网络服务器多少钱 网络安全攻防实时态势 360家电网络安全 软件开发哪个大学擅长 河南拓嘉网络技术科技有限公司 网络安全与数据管理工作 表格数据库怎么编号 应用软件开发安全管理细则 电脑怎么连接网络安全 网络安全绘画图片大全 一等奖 漳平软件开发 天下3怎么两个服务器排棋局 互联网新科技革命对世界经济 网络技术培训需要多久 开源流媒体服务器系统 车载屏连接网络服务器异常 深圳中翰互联网科技有限公司 基带芯片要软件开发吗 哪里培训软件开发好 云服务器上登qq安全吗 数据库可以自己增加主键吗 vs2015添加数据库吗 本地连接无接收数据库 关于网络安全法的规定 vs读取数据库中的数据库 网络安全手抄报上面的字简单点的 如何增强网络安全 小米6怎样使京东连数据库 如何建立试题数据库
0