EasyPlayerPro windows播放器本地音频播放音量控制实现

来源:互联网 发布:淘宝win10激活码来源 编辑:程序博客网 时间:2024/05/21 18:46

背景描述

作为一个播放器, 除了能播放视频和声音外,音量控制是绝对不能缺少的功能; 本文在音视频播放的基础上,增加对音量的控制;

EasyPlayerPro播放器

实现流程

  • 调用mixerGetDevCaps获取音频输出设备列表;
  • 打开指定的音频输出设备;
  • 获取指定音频输出设备的音频属性;
  • 获取和设置音量;
    DWORD GetVolume();    int   SetVolume(DWORD vol);    int   Init(DWORD ComponentType,int *min,int *max);    int     GetAudioOutputDeviceList(MIXER_DEVICE_INFO_T    **devicelist, int *deviceNum);    int     SetAudioDeviceId(int _deviceIdx);

代码实现

//获取音频输出设备列表int CVolumeControl::GetAudioOutputDeviceList(MIXER_DEVICE_INFO_T    **devicelist, int *deviceNum){int     idx = 0;if (mDeviceNum < 1){    MIXERCAPS           mxcaps;    UINT cMixerDevs = mixerGetNumDevs();    for (UINT iDevIndex = 0; iDevIndex < cMixerDevs && iDevIndex<MAX_MIXER_DEVICE_NUM; iDevIndex++)    {        mixerGetDevCaps(iDevIndex, &mxcaps, sizeof(mxcaps));        mixerDeviceList[iDevIndex].id = iDevIndex;        strcpy(mixerDeviceList[iDevIndex].name, mxcaps.szPname);    }    mDeviceNum = cMixerDevs;}if (NULL != deviceNum)      *deviceNum = mDeviceNum;if (NULL != devicelist)     *devicelist = &mixerDeviceList[0];return 0;}//获取音量DWORD CVolumeControl::GetVolume(){int devIdx = mDeviceId;if (devIdx < 0)     return -1;HMIXER hMixer;MMRESULT        mmhr;mmhr = mixerOpen(&hMixer, devIdx, 0, 0, MIXER_OBJECTF_HMIXER|MIXER_GETLINEINFOF_DESTINATION);if( mmhr != MMSYSERR_NOERROR ){    _TRACE(TRACE_LOG_ERROR, "GetVolume::mixerOpen fail. %d\n", mmhr);    return 0;}MIXERCAPS   tmixercaps;if( mixerGetDevCaps( devIdx, &tmixercaps, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR ) {    mixerClose(hMixer);    return -1;}bool ffind = false;MIXERLINE       mxline;for(int i = 0; i < (int)tmixercaps.cDestinations; i++ ) {    ZeroMemory( &mxline, sizeof(MIXERLINE) );    mxline.cbStruct      = sizeof(MIXERLINE);    mxline.dwDestination = i;    mmhr = ::mixerGetLineInfo( (HMIXEROBJ)hMixer, &mxline, MIXER_OBJECTF_HMIXER);// | MIXER_GETLINEINFOF_COMPONENTTYPE );    if( mmhr != MMSYSERR_NOERROR ) {        continue;    }    else {        if( mxline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_DIGITAL )         {            if( 0 != (MIXERLINE_LINEF_ACTIVE & mxline.fdwLine) )             {                ffind = true;                break;            }        }        else if( mxline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_MONITOR )         {            if( 0 != (MIXERLINE_LINEF_ACTIVE & mxline.fdwLine) )             {                ffind = true;                break;            }        }        else if( mxline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_SPEAKERS )         {            if( 0 != (MIXERLINE_LINEF_ACTIVE & mxline.fdwLine) )             {                ffind = true;                break;            }        }    }}MIXERCONTROL    mxcWaveoutMux;memset(&mxcWaveoutMux, 0x00, sizeof(MIXERCONTROL));    _GetLineControls( hMixer, mxline, &mxcWaveoutMux, NULL, NULL );MIXERCONTROLDETAILS mxcd;MIXERCONTROLDETAILS_UNSIGNED mxdu;memset(&mxdu, 0x00, sizeof(MIXERCONTROLDETAILS_UNSIGNED));mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);mxcd.cMultipleItems = 0;  mxcd.cChannels = mxline.cChannels;mxcd.dwControlID = mxcWaveoutMux.dwControlID;mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);mxcd.paDetails = &mxdu;mmhr = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE);if( mmhr != MMSYSERR_NOERROR ){    _TRACE(TRACE_LOG_ERROR, "GetVolume::mixerGetControlDetails fail. %d\n", mmhr);}mixerClose(hMixer);_TRACE(TRACE_LOG_DEBUG, "GetVolume: %d\n", mxdu.dwValue);return mxdu.dwValue;}//设置音量int CVolumeControl::SetVolume(DWORD vol){int devIdx = mDeviceId;if (devIdx < 0)     return -1;HMIXER hMixer;MMRESULT        mmhr;mmhr = mixerOpen(&hMixer, 0, 0, 0, 0);if (mmhr!= MMSYSERR_NOERROR){    _TRACE(TRACE_LOG_ERROR, "mixerOpen fail. %d\n", mmhr);    return -1;}MIXERCAPS   tmixercaps;if( mixerGetDevCaps( devIdx, &tmixercaps, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR ) {    mixerClose(hMixer);    return -1;}bool ffind = false;MIXERLINE       mxline;for(int i = 0; i < (int)tmixercaps.cDestinations; i++ ) {    ZeroMemory( &mxline, sizeof(MIXERLINE) );    mxline.cbStruct      = sizeof(MIXERLINE);    mxline.dwDestination = i;    mmhr = ::mixerGetLineInfo( (HMIXEROBJ)hMixer, &mxline, MIXER_OBJECTF_HMIXER);// | MIXER_GETLINEINFOF_COMPONENTTYPE );    if( mmhr != MMSYSERR_NOERROR ) {        continue;    }    else {        //        if( mxline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_DIGITAL )         {            if( 0 != (MIXERLINE_LINEF_ACTIVE & mxline.fdwLine) )             {                ffind = true;                break;            }        }        else if( mxline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_MONITOR )         {            if( 0 != (MIXERLINE_LINEF_ACTIVE & mxline.fdwLine) )             {                ffind = true;                break;            }        }        else if( mxline.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_SPEAKERS )         {            if( 0 != (MIXERLINE_LINEF_ACTIVE & mxline.fdwLine) )             {                ffind = true;                break;            }        }    }}MIXERCONTROL    mxcWaveoutMux;memset(&mxcWaveoutMux, 0x00, sizeof(MIXERCONTROL));    _GetLineControls( hMixer, mxline, &mxcWaveoutMux, NULL, NULL );int ret = 0;MIXERCONTROLDETAILS mxcd;MIXERCONTROLDETAILS_UNSIGNED mxdu;memset(&mxdu, 0x00, sizeof(MIXERCONTROLDETAILS_UNSIGNED));mxdu.dwValue = vol;mxcd.cMultipleItems = 0; mxcd.cChannels = mxline.cChannels;mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);mxcd.dwControlID = mxcWaveoutMux.dwControlID;mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);mxcd.paDetails = &mxdu;mmhr = mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER); if (mmhr != MMSYSERR_NOERROR){    ret = -1;}mixerClose(hMixer);return ret;}

关于EasyPlayerPro播放器

EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP、RTMP、HTTP、HLS、UDP、RTP、File等多种流媒体协议播放、支持本地文件播放,支持本地抓拍、本地录像、播放旋转、多屏播放、倍数播放等多种功能特性,核心基于ffmpeg,稳定、高效、可靠、可控,支持Windows、Android、iOS三个平台,目前在多家教育、安防、行业型公司,都得到的应用,广受好评!

EasyPlayerPro:https://github.com/EasyDSS/EasyPlayerPro

点击链接加入群【EasyPlayer & EasyPlayerPro】:544917793

技术支持

  • 邮件:support@easydarwin.org

  • QQ交流群:544917793

获取更多信息

EasyDarwin开源流媒体服务器:www.EasyDarwin.org

EasyDSS商用流媒体解决方案:www.EasyDSS.com

EasyNVR无插件直播方案:www.EasyNVR.com

Copyright © EasyDarwin Team 2012-2017

EasyDarwin

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果x掉电快怎么办 苹果8plus死机怎么办 苹果6splus死机怎么办 iphone6手机很卡怎么办 苹果8手机黑屏怎么办 苹果手机8黑屏怎么办 苹果机白屏死机怎么办 苹果手机动不了怎么办 苹果出现死机了怎么办 苹果8s死机怎么办 苹果手机总是死机怎么办 苹果x总是死机怎么办 苹果七总是死机怎么办 苹果5总是死机怎么办 6s死机开不开怎么办 iphone7p变卡了怎么办 苹果升级后死机怎么办 苹果系统死机了怎么办 苹果11.4系统卡怎么办 os系统死机黑屏怎么办 苹果系统卡死了怎么办 mac系统死机了怎么办 苹果7死机怎么办黑屏 苹果x突然黑屏怎么办 三星A76手机死机怎么办 iphone死机无法关机怎么办 iphone升级死机了怎么办 爱疯x死机怎么办 苹果x连续死机怎么办 爱疯死机了怎么办 苹果手机总死机怎么办 苹果7蓝屏死机怎么办 苹果x屏幕失灵怎么办 手机不用也发烫怎么办 苹果七plus死机怎么办 苹果7p死机怎么办 苹果手机死机怎么办啊 6p显示屏失灵怎么办 苹果7屏幕死机怎么办 苹果七老是死机怎么办 手机一直闪退怎么办