• 1909阅读
  • 0回复

Qt音视频开发25-ffmpeg音量设置 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2020-09-25

## 一、前言
音视频的播放、关闭、暂停、继续这几个基本功能,绝大部分人都是信手拈来的搞定,关于音量调节还是稍微饶了下弯弯,最开始打算采用各个系统的api来处理,坐下来发现不大好,系统的支持不完美,比如有些api限定了win7,而xp确没有,而且这玩意控制的是全局的音量,不好,大部分时候需要控制的是当前播放的媒体的音量,估计vlc和mpv这类播放器在处理声音的时候也有过如此的场景分析,后面还测试过用ffmpeg的filter滤镜代码控制音频数据的分贝值,比较繁琐,代码量也大,不方便初学者学习,最后灵机一动去找QAudioOutput的函数看下有没有volume的函数,果真有卧槽,原来自带了,对Qt的爱慕之情又猛增了几十分,这里要注意的是QAudioOutput的音量值参数是0-1的范围double类型,而不是像vlc等播放器是0-100的值,所以需要自行转换。
如果搞定了音量的控制,那静音的设置当然分分钟啦,无非就是记住之前的音量,然后将音量设置0,取消静音的时候自动设置音量为最后记住的音量值即可。

## 二、功能特点
1. 多线程实时播放视频流+本地视频+USB摄像头等。
2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。
3. 多线程显示图像,不卡主界面
4. 自动重连网络摄像头。
5. 可设置边框大小即偏移量和边框颜色。
6. 可设置是否绘制OSD标签即标签文本或图片和标签位置。
7. 可设置两种OSD位置和风格。
8. 可设置是否保存到文件以及文件名。
9. 可直接拖曳文件到ffmpegwidget控件播放。
10. 支持h265视频流+rtmp等常见视频流。
11. 可暂停播放和继续播放。
12. 支持存储单个视频文件和定时存储视频文件。
13. 自定义顶部悬浮条,发送单击信号通知,可设置是否启用。
14. 可设置画面拉伸填充或者等比例填充。
15. 可设置解码是速度优先、质量优先、均衡处理。
16. 可对视频进行截图(原始图片)和截屏。
17. 录像文件存储支持裸流和MP4文件。
18. 音视频完美同步,采用外部时钟同步策略。
19. 支持seek定位播放位置。
20. 支持qsv、dxva2、d3d11va等硬解码。
21. 支持opengl绘制视频数据,极低CPU占用。
22. 支持安卓和嵌入式linux,交叉编译即可。

## 三、效果图




## 四、相关站点
1. 国内站点:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)
2. 国际站点:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)
3. 个人主页:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)
4. 知乎主页:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)
5. 体验地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

## 五、核心代码
```c++
bool FFmpegThread::getMute()
{
    return (getVolume() == 0);
}

int volume = 0;
void FFmpegThread::setMute(bool mute)
{
    //先记住之前的音量以便重新设置
    if (mute) {
        volume = getVolume();
        setVolume(0);
    } else {
        setVolume(volume);
    }
}

int FFmpegThread::getVolume()
{
    if (this->isRunning()) {
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
        return audioOutput->volume() * 100;
#endif
    } else {
        return 0;
    }
}

void FFmpegThread::setVolume(int volume)
{
    if (this->isRunning()) {
#if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
        //查阅手册说范围值是 0.0 - 1.0
        audioOutput->setVolume((float)volume / 100.0);
#endif
    }
}
```
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个