为什么要做实时音量调节
RTMP或RTSP直播播放音量调节,主要用于多实例(多窗口)播放场景下,比如同时播放4路RTMP或RTSP流,如果音频全部打开,几路audio同时打开,可能会影响用户体验,我们通用的做法是支持播放端实时静音,更细粒度的做法是可以实时调节每一路RTMP/RTSP流的音量。
音量调节接口设计
RTMP或RTSP直播播放端音量调节功能设计主要考虑到一点,和市面通用的本地播放器或点播播放器功能对齐(如VLC、PotPlayer等),音量可以实时调整即可,本文以大牛直播SDK的Windows平台RTSP直播播放SDK/RTMP直播播放SDK的C++接口demo为例(C#亦可,具体可参照 Github),简单介绍下相关的接口设计和用法。
/* 设置播放音量, 范围是[0, 100], 0是静音,100是最大音量, 默认是100 调用正确返回NT_ERC_OK */ NT_UINT32(NT_API *SetAudioVolume)(NT_HANDLE handle, NT_INT32 volume);
具体调用:
C++的demo以CSliderCtrl控件为例,音量调节力度,设置到[0, 100], 设置为0时,实时静音,设置为100时,默认原音量输出,具体调用如下:
CSliderCtrl slider_audio_volume_; player_api_.SetAudioVolume(player_handle_, slider_audio_volume_.GetPos());
void CSmartPlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default if (IDC_SLIDER_VOLUME == pScrollBar->GetDlgCtrlID()) { switch (nSBCode) { case SB_LINELEFT: case SB_LINERIGHT: case SB_PAGELEFT: case SB_PAGERIGHT: case SB_LEFT: case SB_RIGHT: { /*std::wostringstream wss; wss << L"OnHScroll nSBCode:" << nSBCode << " nPos:" << nPos << " GetPos():" << slider_audio_device_volume_.GetPos() << "\r\n"; OutputDebugString(wss.str().c_str());*/ if (is_playing_ && player_handle_ != NULL) { player_api_.SetAudioVolume(player_handle_, slider_audio_volume_.GetPos()); } } break; case SB_THUMBPOSITION: { /*std::wostringstream wss; wss << L"SB_THUMBPOSITION" << " nPos:" << nPos << " GetPos():" << slider_audio_device_volume_.GetPos() << "\r\n"; OutputDebugString(wss.str().c_str());*/ } break; case SB_THUMBTRACK: { /*std::wostringstream wss; wss << L"SB_THUMBTRACK" << " nPos:" << nPos << " GetPos():" << slider_audio_device_volume_.GetPos() << "\r\n"; OutputDebugString(wss.str().c_str());*/ if (is_playing_ && player_handle_ != NULL) { player_api_.SetAudioVolume(player_handle_, slider_audio_volume_.GetPos()); } } break; default: break; } } CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); }
实时音量调节作为RTSP或RTMP直播播放器的扩展功能,在好多行业用处很大,如教育类、监控类多窗口(大屏环境下)播放场景,感兴趣的开发者可以试试看。