为什么要做实时音量调节
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 defaultif (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直播播放器的扩展功能,在好多行业用处很大,如教育类、监控类多窗口(大屏环境下)播放场景,感兴趣的开发者可以试试看。