技术背景
好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明:
1. 使用VLC for Android
VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。它也能作为unicast或multicast的流式服务器在IPv4或IPv6的高速网络连接下使用。它融合了FFmpeg计划的解码器与libdvdcss程序库使其有播放多媒体文件及加密DVD影碟的功能。
VLC for Android是一个开源的媒体播放器,它支持多种格式,包括RTSP流。你可以将VLC集成到你的Android应用中,或者简单地将RTSP流的URL作为Intent发送到VLC应用进行播放。
- 能播放任何内容 - 文件、光盘、摄像头、设备及流媒体
- 可播放大多数格式,无需安装编解码器包 - MPEG-2, MPEG-4, H.264, MKV, WebM, WMV, MP3...
- 可在所有平台运行 - Windows, Linux, Mac OS X, Unix, iOS, Android ...
- 完全免费 - 无间谍软件,无广告,无跟踪用户的行为
集成VLC到Android项目中:
将VLC集成到Android平台,主要涉及从VLC的官方仓库获取源代码、配置Android开发环境、构建项目、部署到Android设备以及进行测试等步骤。以下是一个详细的集成流程:
1. 获取VLC源代码
- 从VLC的官方Git仓库中获取源代码。可以通过Git命令克隆VLC的Android分支到本地机器上,例如使用命令
git clone https://code.videolan.org/videolan/vlc-android.git
。
2. 配置Android开发环境
- 安装Android Studio和Android NDK。Android Studio是开发Android应用的官方IDE,而Android NDK则用于编译本地代码(如C/C++)。
- 确保Android Studio和所有必要的插件都已更新到最新版本。
- 配置NDK路径和其他必要的环境变量,以便在构建过程中能够找到这些工具。
3. 构建VLC的Android项目
- 打开Android Studio,并选择“Open an existing Android Studio project”。
- 在打开的对话框中,导航到你所克隆的VLC仓库,并选择
vlc-android
文件夹作为项目目录。 - 等待Android Studio加载项目。在项目导航器中,找到
libvlc
模块,并右键点击选择“Reimport all Gradle projects”以确保所有Gradle依赖都被正确解析。 - 等待Gradle构建完成。这可能需要一些时间,因为VLC项目包含了大量的代码和依赖。
4. 部署到Android设备
- 连接你的Android设备到电脑上,并确保设备已开启USB调试模式。
- 在Android Studio的工具栏上,点击“Run”按钮,并选择你的Android设备作为目标。
- 等待应用在设备上安装和启动。如果一切正常,VLC应用应该能够在你的Android设备上运行。
5. 测试VLC功能
- 在设备上打开VLC应用,并尝试播放一些音频或视频文件,特别是RTSP流等流媒体内容。
- 确保音频和视频播放正常,没有崩溃或错误发生。
- 进行其他必要的测试,如调整播放速度、切换音频轨道等,以确保VLC的所有功能都能正常工作。
注意事项
- 在集成过程中,可能会遇到一些与特定Android版本或设备相关的问题。此时,建议查阅VLC的官方文档或社区论坛以获取帮助。
- 如果需要修改VLC的源代码以满足特定的需求(如添加新的播放功能或优化性能),请确保你了解所做修改的影响,并在提交代码前进行充分的测试。
- VLC的Android版本可能不包含桌面版本的所有功能,因此在集成时需要仔细评估所需功能是否可用。
2. 使用ExoPlayer
Google的ExoPlayer是一个开源的媒体播放库,旨在替代Android的MediaPlayer API,并提供了更广泛的格式支持和更好的性能。ExoPlayer支持RTSP流(通过扩展或自定义Renderer)。
通过FFmpeg支持RTSP
由于FFmpeg是一个非常强大的多媒体框架,它支持包括RTSP在内的多种流媒体协议。你可以将FFmpeg与ExoPlayer结合使用,通过FFmpeg来解码RTSP流,并将解码后的数据传递给ExoPlayer进行播放。
-
集成FFmpeg库:首先,你需要在你的Android项目中集成FFmpeg的库。这可以通过将FFmpeg的源代码编译为适用于Android的库,或者使用已经编译好的FFmpeg Android库来完成。
-
创建自定义MediaSource:在ExoPlayer中,你可以通过创建自定义的
MediaSource
来集成FFmpeg。这个MediaSource
将负责使用FFmpeg来拉取和解码RTSP流,并将解码后的数据(通常是PCM音频和YUV或RGB视频帧)传递给ExoPlayer的渲染器。 -
渲染解码后的数据:ExoPlayer的渲染器(如
SimpleExoPlayer.VideoRendererEventListener
和SimpleExoPlayer.AudioRendererEventListener
)可以接收解码后的音频和视频数据,并将其渲染到屏幕上或播放出来。然而,由于FFmpeg和ExoPlayer的渲染机制可能不同,你可能需要编写一些额外的代码来桥接这两个系统。
3. SmartPlayer
SmartPlayer是大牛直播SDK SmartMediaKit系列下的低延迟RTSP播放模块,全自研内核、功能齐全、高稳定、超低延迟,超低资源占用,适用于安防、教育、单兵指挥等行业,延迟可达到150-300ms。
- [支持播放协议]高稳定、超低延迟、业内首屈一指的RTSP直播播放器SDK;
- [多实例播放]支持多实例播放;
- [事件回调]支持网络状态、buffer状态等回调;
- [视频格式]支持H.265、H.264,此外,还支持RTSP MJPEG播放;
- [音频格式]支持AAC/PCMA/PCMU;
- [H.264/H.265软解码]支持H.264/H.265软解;
- [H.264硬解码]Windows/Android/iOS支持特定机型H.264硬解;
- [H.265硬解]Windows/Android/iOS支持特定机型H.265硬解;
- [H.264/H.265硬解码]Android支持设置Surface模式硬解和普通模式硬解码;
- [RTSP模式设置]支持RTSP TCP/UDP模式设置;
- [RTSP TCP/UDP自动切换]支持RTSP TCP、UDP模式自动切换;
- [RTSP超时设置]支持RTSP超时时间设置,单位:秒;
- [RTSP 401认证处理]支持上报RTSP 401事件,如URL携带鉴权信息,会自动处理;
- [缓冲时间设置]支持buffer time设置;
- [首屏秒开]支持首屏秒开模式;
- [复杂网络处理]支持断网重连等各种网络环境自动适配;
- [快速切换URL]支持播放过程中,快速切换其他URL,内容切换更快;
- [音视频多种render机制]Android平台,视频:surfaceview/OpenGL ES,音频:AudioTrack/OpenSL ES;
- [实时静音]支持播放过程中,实时静音/取消静音;
- [实时音量调节]支持播放过程中实时调节音量;
- [实时快照]支持播放过程中截取当前播放画面;
- [只播关键帧]Windows平台支持实时设置是否只播放关键帧;
- [渲染角度]支持0°,90°,180°和270°四个视频画面渲染角度设置;
- [渲染镜像]支持水平反转、垂直反转模式设置;
- [等比例缩放]支持图像等比例缩放绘制(Android设置surface模式硬解模式不支持);
- [实时下载速度更新]支持当前下载速度实时回调(支持设置回调时间间隔);
- [解码前视频数据回调]支持H.264/H.265数据回调;
- [解码后视频数据回调]支持解码后YUV/RGB数据回调;
- [解码前音频数据回调]支持AAC/PCMA/PCMU数据回调;
- [音视频自适应]支持播放过程中,音视频信息改变后自适应;
- [扩展录像功能]完美支持和录像SDK组合使用。
总结
选择哪种方法取决于你的具体需求、对性能的要求以及你愿意投入多少时间来集成和维护代码。VLC for Android和ExoPlayer是较为简单和流行的选择,如果对稳定性、功能性能要求非常高,我们认为可以看看大牛直播SDK的SmartPlayer,一个好的RTSP播放器,我们认为,可以参考以下标准:
1. 低延迟: 大多数RTSP的播放都面向直播场景,如果延迟过大,严重影响体验,所以,低延迟是衡量一个好的RTSP播放器非常重要的指标,目前大牛直播SDK的RTSP直播播放延迟比开源播放器更优异(大牛直播SDK延迟在毫秒级,开源播放器如VLC,延迟相对比较大),而且长时间运行下,大牛直播SDK播放端不会造成延迟累积,开源或第三方播放器,长时间运行,容易产生延迟累积;
2. 音视频同步处理: 大多播放器为了追求低延迟,甚至不做音视频同步,拿到audio video直接播放,导致a/v不同步,还有就是时间戳乱跳等各种问题,大牛直播SDK提供的播放器,具备好的时间戳同步和异常时间戳矫正机制;
备注:如果是超低延迟模式下,可以0 buffer,不做音视频同步:
3. 支持多实例: 大牛直播SDK提供的RTSP直播播放SDK支持在设备性能允许的情况下,支持多实例播放RTSP流数据,大多开源播放器对多实例支持不太友好;
4. 支持buffer time设置: 在一些有网络抖动的场景,播放器需要支持buffer time设置,一般来说,以毫秒计,开源播放器对此支持不够友好;
5. 实时静音: 比如,多窗口播放RTSP流,如果每个audio都播放出来,体验非常不好,所以实时静音功能非常必要,开源播放器不具备实时静音功能;
6. 视频view旋转: 好多摄像头由于安装限制,导致图像倒置,所以一个好的RTSP播放器应该支持如视频view实时旋转(0° 90° 180° 270°)、水平反转、垂直反转,开源或第三方播放器不具备此功能;
7. 支持解码后audio/video数据输出: 大牛直播SDK接触到好多开发者,希望能在播放的同时,获取到YUV或RGB数据,进行人脸匹配等算法分析,开源播放器不具备此功能;
8. 实时快照: 感兴趣或重要的画面,实时截取下来非常必要,一般播放器不具备快照能力,开源播放器不具备此功能;
9. 网络抖动处理(如断网重连): 稳定的网络处理机制、支持如断网重连等,开源播放器对网络异常处理支持较差;
10. 长期运行稳定性: 大牛直播SDK提供的RTSP直播播放SDK适用于长时间运行,开源播放器对长时间运行稳定性支持较差;
11. 实时下载速度反馈: 大牛直播SDK提供音视频流实时下载回调,并可设置回调时间间隔,确保实时下载速度反馈,以此来监听网络状态,开源播放器不具备此能力;
12. 异常状态处理、Event状态回调: 如播放的过程中断网,大牛直播SDK提供的播放器可实时回调相关状态,确保上层模块感知处理,开源播放器对此支持不好;
13. 设置视频填充模式(等比例显示): 好多情况下,有些场景需要全view铺满播放,有些为了防止视频拉伸,可以设置成等比例缩放显示;
14. D3D检测: 一般来说市面上的大多Windows都支持D3D,有些小众化的,只支持GDI模式绘制,所以为了更好的兼容性,这个接口非常必要;
15. 实时音量调节: 实时音量调节特别是在多路播放的场景下,如大屏窗体环境下,通过更细粒度的音量调节,实现更好的播放体验;
16. 只播放关键帧: 特别是大屏多实例场景播放的时候,尽管我们已经CPU占用非常低了,如果只是查看大概的监控情景,实现更多路的播放,只播放关键帧是个非常好的功能点,如果需要原始帧播放,可以实时调节即可;
17. 特定机型硬解码: 特定机型硬解码,也主要是用于多路播放场景下,通过硬解码,实现更低的CPU占用目的;
18. TCP-UDP设置: 考虑到部分服务器或硬件设备或网络环境对TCP、UDP某一个支持的比较好,我们加了设置接口;
19. TCP-UDP自动切换: 这个是更细力度的接口,比如默认设置了TCP模式,TCP模式下收不到数据,超时后,自动切换到UDP模式尝试,一般开源播放器不具备此功能;
20. 超时时间设定: 比如10-12秒收不到数据,自动重连,一般开源播放器支持不好。
从实际比较测试来看,无论是vlc player 还是ExoPlayer,更适合用来做点播播放,在延迟和功能覆盖上,支持的并不是太好,大牛直播SDK的SmartPlayer,是专门针对直播设计的RTSP、RTMP播放器,延迟非常低,常规功能基本都覆盖,但不支持点播播放。以上抛砖引玉,感兴趣的开发者,可以单独跟我们沟通交流。