Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

本文主要是介绍Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

技术背景

好多开发者需要遴选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播放器,延迟非常低,常规功能基本都覆盖,但不支持点播播放。以上抛砖引玉,感兴趣的开发者,可以单独跟我们沟通交流。

这篇关于Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1151753

相关文章

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索