技术背景
好多开发者在播放RTSP或RTMP流的时候,特别是多路播放的时候,希望能试试调节单个视频画面的声音(静音或放大缩小音量),常见的实时调节播放音量可以通过以下方式实现:
利用操作系统的音频控制
在某些情况下,我们可能无法直接通过播放器控制音量,这时候,可以使用操作系统的全局音频控制来调节RTSP或RTMP播放器的音量。大多数操作系统都提供了系统级的音频控制功能,通常可以通过任务栏上的音量图标或系统设置中的音频选项进行调节。当你调整系统音量时,所有正在播放音频的应用程序(包括 RTMP 播放器)的音量也会相应地改变。
利用播放模块自带的音量调节控制
一个功能完善的RTSP或RTMP播放器,一般自带实时静音或实时音量调节,如果支持这种模式,就非常方便,可以只条件播放器的volume,不影响系统的音量。
支持实时调节音量的播放器
VLC Media Player
VLC Media Player 是一款免费、开源的多媒体播放器,具有强大的功能和广泛的适用性。
- 多格式支持
- 视频格式:支持几乎所有常见的视频格式,包括 MPEG、AVI、WMV、MP4、MKV、FLV 等。无论是从网络下载的视频文件,还是自己录制的视频,VLC 通常都能顺利播放。
- 音频格式:同样支持众多音频格式,如 MP3、WAV、FLAC、AAC 等。可以作为音乐播放器使用,满足用户不同的音频播放需求。
- 流媒体协议:除了本地文件播放,VLC 还支持多种流媒体协议,如 RTMP、HTTP、RTSP 等。这使得用户可以直接播放来自网络的流媒体内容,如在线视频、网络电台等。
- 跨平台使用
- 操作系统支持:可在 Windows、macOS、Linux 等多个主流操作系统上运行。无论你使用哪种操作系统,都可以享受到 VLC 带来的强大播放功能。
- 移动平台:此外,VLC 也有适用于移动平台的版本,如 Android 和 iOS。在移动设备上,用户同样可以使用 VLC 播放本地视频和流媒体,方便随时随地观看视频内容。
- 播放控制功能
- 播放进度控制:用户可以通过拖动播放进度条来快速定位到视频的任意位置,方便回顾或跳过某些部分。同时,还可以使用快捷键进行精确的逐帧播放,对于视频分析和截图非常有用。
- 音量调节:提供直观的音量滑块,方便用户调整播放音量。还可以使用快捷键快速静音或调整音量大小。此外,VLC 支持音频均衡器调节,用户可以根据自己的喜好调整音频的频率响应。
- 字幕支持:可以加载外部字幕文件,支持多种字幕格式。用户可以调整字幕的字体、大小、颜色和位置,以获得更好的观看体验。同时,VLC 还支持自动搜索和下载字幕功能,方便用户找到合适的字幕。
- 高级功能
- 视频效果调节:提供了一些视频效果调节选项,如亮度、对比度、饱和度、色调等。用户可以根据实际情况调整这些参数,以获得更好的视频显示效果。此外,VLC 还支持视频旋转和翻转功能,对于一些拍摄角度不正确的视频可以进行调整。
- 流媒体录制:可以将正在播放的流媒体内容录制下来,保存为本地文件。这对于一些无法下载的在线视频非常有用,用户可以通过录制的方式保存自己喜欢的视频内容。
- 插件扩展:VLC 支持插件扩展,用户可以根据自己的需求安装各种插件,以增强播放器的功能。例如,有一些插件可以支持更多的视频格式,或者提供额外的播放控制功能。
PotPlayer
PotPlayer 是一款功能强大的多媒体播放器,具有以下特点和功能:
- 广泛的格式支持:
- 几乎能播放所有常见的音频和视频文件格式,如 MP4、AVI、MKV、MOV、FLV、MP3、AAC 等,无论是高清视频还是高质量音频都可以流畅播放。它内置了大量的音视频编解码器,无需用户额外安装其他解码器就能播放绝大多数媒体文件。
- 高度可定制性:
- 用户可以根据自己的喜好和需求对播放器进行深度定制。比如可以调整音频和视频效果,包括亮度、对比度、饱和度、音量等参数;可以设置字幕的样式、字体、大小、颜色、位置等;还能更改播放器的外观主题、快捷键等,满足个性化的播放需求。
- 强大的功能特性:
- 多流支持:支持多个音频和字幕轨道,方便用户切换不同的音频语言或字幕版本。
- 3D 播放:支持多种 3D 格式的视频播放,搭配 3D 眼镜可以获得震撼的 3D 视觉体验。
- 屏幕截图和视频录制:能够方便地截取视频中的画面,支持多种截图格式。还可以录制正在播放的视频,可选择录制整个视频或指定片段36。
- 倍速播放:支持从 0.2 倍到 12 倍速的播放速度调整,方便用户快速浏览视频内容或进行慢动作播放。
- 音频增益调节:可以增强音频的音量,对于一些音量较小的音频文件非常有用。
- 轻量高效:是一款轻量级的播放器,运行时占用较少的系统资源,即使在配置较低的电脑上也能流畅运行,具有快速的启动和加载速度。
- 多国语言支持:支持多种语言界面,包括英语、中文、韩语等,方便不同地区的用户使用。
- 自动搜索和加载字幕:具有自动搜索和加载字幕的功能,能够从互联网上自动查找并下载匹配的字幕文件,为用户提供便利。
SmartPlayer
SmartPlayer是大牛直播SDK旗下的跨平台(支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台)、功能完善、性能优异、毫秒级超低延迟(可达150-300ms延迟)的RTSP、RTMP播放器,以下是其主要功能列表:
- 播放协议支持:
- 广泛的流媒体协议:支持 RTMP、RTSP 等主流直播流媒体协议,可播放相应协议的直播视频流,适用于多种直播场景,如网络直播、监控直播等。
- 视频编码格式支持:支持 H.264、H.265 等视频编码格式,能够播放采用这些编码的高质量视频流,保证视频的清晰度和流畅性。对于 H.265 格式,在部分平台上还支持将 RTSP 的 H.265 视频流录制到 MP4 文件。
- 音频编码格式支持:支持 AAC、PCMA、PCMU、Speex 等音频编码格式,可提供高质量的音频播放效果,满足不同用户对音频的需求。
- 播放控制功能:
- 多实例播放:支持同时播放多路 RTMP 或 RTSP 流,方便用户同时观看多个直播源,例如在监控场景中可同时查看多个监控摄像头的画面。
- 缓冲时间设置:用户可以根据网络状况和自身需求设置缓冲时间,SDK 支持 0 - 10000ms 的缓冲时间区间设置,以保证视频播放的流畅性。
- 首屏秒开:具备首屏秒开模式,能够快速加载并播放视频,减少用户的等待时间,提升观看体验。
- 低延迟模式:公网公网环境下延迟低至150 - 300ms,适用于对实时性要求较高的平衡操控场景。
- 快速切换 URL:在播放过程中支持快速切换其他 URL,方便用户快速切换不同的直播源,适用于多路 URL 轮询等场景。
- 实时音量调节:支持播放过程中的实时音量调节或实时静音操作,用户可以根据需要随时控制音频的播放状态。
- 视频画面控制:
- 渲染角度设置:支持 0°、90°、180° 和 270° 四个视频画面渲染角度设置,方便用户根据实际需求调整视频画面的方向。
- 渲染镜像设置:支持水平反转、垂直反转模式设置,可满足用户对视频画面镜像效果的需求。
- 等比例缩放:支持图像等比例缩放绘制,确保视频画面在不同尺寸的屏幕上都能保持合适的显示比例。
- 录像功能:
- 实时录像:在播放或非播放状态下,可拉取 RTMP 或 RTSP 流录制本地文件。如果需要截取MP4文件的一部分,也可通过开始录像、停止录像重新录制 MP4 文件。
- 录像参数设置:支持设置单个录像文件大小、录像路径等参数,并支持纯音频、纯视频、音视频等多种录制模式。
- 音频转码:支持音频(PCMU、PCMA、Speex 等)转 AAC 后再录像,以满足不同的音频格式需求。
- 事件回调与状态监测:
- 事件回调:支持网络状态、缓冲状态等事件的回调,开发者可以根据这些回调信息实时了解播放器的状态,以便进行相应的处理和优化。
- 数据回调:支持解码前的 H.264/H.265 视频数据回调、解码后的 YUV/RGB 视频数据回调以及解码前的音频数据回调,方便开发者对音视频数据进行进一步的处理和分析。
播放器如何设计音量调节接口
以大牛直播SDK的Windows平台RTSP、RTMP播放器为例,最早,我们设计的接口如下,直接通过实时静音来完成音量调节:
/*
* smart_player_sdk.cs
*/
/*
* 静音接口,1为静音,0为不静音
*/
[DllImport(@"SmartPlayerSDK.dll")]
public static extern UInt32 NT_SP_SetMute(IntPtr handle, Int32 is_mute);
随着需求越来越多,好多场景下,希望能实时调节播放器的音量,所以,后续我们设计了实时音量调节接口:
/*
* smart_player_sdk.cs
*/
/*
* 设置播放音量, 范围是[0, 100], 0是静音,100是最大音量, 默认是100
*/
[DllImport(@"SmartPlayerSDK.dll")]
public static extern UInt32 NT_SP_SetAudioVolume(IntPtr handle, Int32 volume);
调用如下,拖动实时音量调节slider即可实现播放音量的动态调整,如果需要实时静音,调整到0,或者是直接SetMute设置0即可。
if (checkBox_mute.Checked)
{
NTSmartPlayerSDK.NT_SP_SetMute(player_handle_, 1);
}
else
{
NTSmartPlayerSDK.NT_SP_SetMute(player_handle_, 0);
}
private void slider_audio_volume_ValueChanged(object sender, EventArgs e)
{
cur_audio_volume.Text = slider_audio_volume.Value.ToString();
if (is_playing_ && player_handle_ != IntPtr.Zero)
{
NTSmartPlayerSDK.NT_SP_SetAudioVolume(player_handle_, slider_audio_volume.Value);
}
}