IT评测·应用市场-qidao123.com

标题: Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音 [打印本页]

作者: 络腮胡菲菲    时间: 2025-3-14 10:27
标题: Qt/C++音视频开发82-系统音量值获取和设置/音量大小/静音
一、前言

在音视频开发中,音量的控制分两块,一个是控制播放器本身的音量,绝大部分场景都是需要控制这个,这个不会影响系统音量的设置。还有一种场景是需要控制系统的音量,因为播放器本身的音量是在系统音量的基础上控制的,也就是系统音量30%,意味着播放器最大的音量也是只能到系统音量的30%,这个环境在小部分场景中是禁绝确的,不是用户期望的,比如展厅展馆播放器,他们很多时间盼望播放器音量的大小就是系统音量的大小,以是需要搞个开关,开启音量设置是否自动跟随系统音量。
在windows上读取和设置系统的音量有多种方法,最常见最万能最准确的办法就是使用winapi接口,一般会引入windows.h/mmdeviceapi.h/endpointvolume.h/audioclient.h四个头文件,调用其中的几个函数接口就行。还有另外一种方法比较独特,就是用纯Qt方法,模拟系统按键,发送Fn+F2/Fn+F3来控制音量淘汰和增加,这种方法缺点就是无法获取当前音量值。
这里遇到个小插曲,就是封装好的这个类,在mingw正常,但是msvc居然编译通不外,反面发现原来是头文件引入顺序的问题,要先引入系统的头文件,再引入Qt的头文件,就没问题,可能Qt的头文件也引入的系统的头文件,然后又本身增加了一些界说导致的冲突吧。
二、结果图






三、干系所在

四、功能特点

4.1 基础功能

4.2 特色功能

4.3 视频控件

五、干系代码

  1. #include "volumehelper.h"
  2. #include "qdebug.h"
  3. #ifdef setsystemvolume
  4. #include "windows.h"
  5. #include "audioclient.h"
  6. #include "mmdeviceapi.h"
  7. #include "endpointvolume.h"
  8. #endif
  9. int VolumeHelper::getVolume()
  10. {
  11. #ifdef setsystemvolume
  12.     HRESULT hr;
  13.     IMMDeviceEnumerator *pDeviceEnumerator = 0;
  14.     IMMDevice *pDevice = 0;
  15.     IAudioEndpointVolume *pAudioEndpointVolume = 0;
  16.     IAudioClient *pAudioClient = 0;
  17.     try {
  18.         hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void **)&pDeviceEnumerator);
  19.         if (FAILED(hr)) {
  20.             throw "CoCreateInstance";
  21.         }
  22.         hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
  23.         if (FAILED(hr)) {
  24.             throw "GetDefaultAudioEndpoint";
  25.         }
  26.         hr = pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void **)&pAudioEndpointVolume);
  27.         if (FAILED(hr)) {
  28.             throw "pDevice->Active";
  29.         }
  30.         hr = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void **)&pAudioClient);
  31.         if (FAILED(hr)) {
  32.             throw "pDevice->Active";
  33.         }
  34.         float fVolume;
  35.         hr = pAudioEndpointVolume->GetMasterVolumeLevelScalar(&fVolume);
  36.         if (FAILED(hr)) {
  37.             throw "SetMasterVolumeLevelScalar";
  38.         }
  39.         pAudioClient->Release();
  40.         pAudioEndpointVolume->Release();
  41.         pDevice->Release();
  42.         pDeviceEnumerator->Release();
  43.         return fVolume * 100;
  44.     } catch (...) {
  45.         if (pAudioClient) {
  46.             pAudioClient->Release();
  47.         }
  48.         if (pAudioEndpointVolume) {
  49.             pAudioEndpointVolume->Release();
  50.         }
  51.         if (pDevice) {
  52.             pDevice->Release();
  53.         }
  54.         if (pDeviceEnumerator) {
  55.             pDeviceEnumerator->Release();
  56.         }
  57.         throw;
  58.     }
  59. #endif
  60.     return 0;
  61. }
  62. bool VolumeHelper::setVolume(int volume)
  63. {
  64. #ifdef setsystemvolume
  65.     HRESULT hr;
  66.     IMMDeviceEnumerator *pDeviceEnumerator = 0;
  67.     IMMDevice *pDevice = 0;
  68.     IAudioEndpointVolume *pAudioEndpointVolume = 0;
  69.     IAudioClient *pAudioClient = 0;
  70.     try {
  71.         hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void **)&pDeviceEnumerator);
  72.         if (FAILED(hr)) {
  73.             throw "CoCreateInstance";
  74.         }
  75.         hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
  76.         if (FAILED(hr)) {
  77.             throw "GetDefaultAudioEndpoint";
  78.         }
  79.         hr = pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void **)&pAudioEndpointVolume);
  80.         if (FAILED(hr)) {
  81.             throw "pDevice->Active";
  82.         }
  83.         hr = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void **)&pAudioClient);
  84.         if (FAILED(hr)) {
  85.             throw "pDevice->Active";
  86.         }
  87.         if (volume == -2) {
  88.             hr = pAudioEndpointVolume->SetMute(FALSE, NULL);
  89.             if (FAILED(hr)) {
  90.                 throw "SetMute";
  91.             }
  92.         } else if (volume == -1) {
  93.             hr = pAudioEndpointVolume->SetMute(TRUE, NULL);
  94.             if (FAILED(hr)) {
  95.                 throw "SetMute";
  96.             }
  97.         } else if (volume >= 0 && volume <= 100) {
  98.             float fVolume = volume / 100.0f;
  99.             hr = pAudioEndpointVolume->SetMasterVolumeLevelScalar(fVolume, &GUID_NULL);
  100.             if (FAILED(hr)) {
  101.                 throw "SetMasterVolumeLevelScalar";
  102.             }
  103.             pAudioClient->Release();
  104.             pAudioEndpointVolume->Release();
  105.             pDevice->Release();
  106.             pDeviceEnumerator->Release();            
  107.         }
  108.         return true;
  109.     } catch (...) {
  110.         if (pAudioClient) {
  111.             pAudioClient->Release();
  112.         }
  113.         if (pAudioEndpointVolume) {
  114.             pAudioEndpointVolume->Release();
  115.         }
  116.         if (pDevice) {
  117.             pDevice->Release();
  118.         }
  119.         if (pDeviceEnumerator) {
  120.             pDeviceEnumerator->Release();
  121.         }
  122.         throw;
  123.     }
  124. #endif
  125.     return false;
  126. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4