千家信息网

Qt如何实现ffmpeg音频播放

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要为大家展示了"Qt如何实现ffmpeg音频播放",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Qt如何实现ffmpeg音频播放"这篇文章吧。一、
千家信息网最后更新 2026年11月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安全错误 数据库的锁怎样保障安全 互联网科技公司排名 华服互联网科技怎么样 互联网科技公司起名 合肥互联网科技公司 青岛互联网科技公司 西安互联网科技公司 深圳天众互联网科技公司 科技互联网创业计划书 互联网金融和金融科技 盛创互联网科技有限公司 甘肃拓世互联网科技有限公司 海南科技产业互联网平台 温州喔噻互联网科技有限公司 以后互联网后是啥科技 互联网科技公司实习生 江苏苏星互联网科技有限公司 电子商务与互联网科技的关系 美国互联网科技公司 互联网风格科技公司名称 广州全民伙伴互联网科技有限公司 互联网和科技技术 互联网 科技公司 奇士达互联网科技 彤创互联网科技有限公司 世界互联网科技公司市值排名 黑科技闪耀互联网之光 花神(南京)互联网科技有限公司 速维有品互联网信息科技(苏州)有限公司 10位科技互联网大佬 承德科技产业互联网平台
0