技术背景

好多开发者需要遴选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进行播放。

  1. 集成FFmpeg库:首先,你需要在你的Android项目中集成FFmpeg的库。这可以通过将FFmpeg的源代码编译为适用于Android的库,或者使用已经编译好的FFmpeg Android库来完成。

  2. 创建自定义MediaSource:在ExoPlayer中,你可以通过创建自定义的MediaSource来集成FFmpeg。这个MediaSource将负责使用FFmpeg来拉取和解码RTSP流,并将解码后的数据(通常是PCM音频和YUV或RGB视频帧)传递给ExoPlayer的渲染器。

  3. 渲染解码后的数据:ExoPlayer的渲染器(如SimpleExoPlayer.VideoRendererEventListenerSimpleExoPlayer.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播放器,延迟非常低,常规功能基本都覆盖,但不支持点播播放。以上抛砖引玉,感兴趣的开发者,可以单独跟我们沟通交流。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐