在 android 应用程序上播放来自媒体服务器的实时流

问题描述

我的设置如下:

  • 用于创建视频源的 OBS Studio
  • 用于分发流的 Ant 媒体服务器

现在我正在构建一个显示此流的应用程序,我目前正在使用 ExoPlayer,但是我很难让它同时适用于 RTMP 和 HLS,我阅读了一些可以嵌入我的应用程序中的网络播放器会更容易吗?这是我的 ExoPlayer 代码

 //RTMP Url
    String url = "rtmp://192.168.1.244/WebRTCApp/379358104902020985845622";
    
    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory videoTrackSelectionFactory =
            new AdaptiveTrackSelection.Factory();
    TrackSelector trackSelector =
            new DefaultTrackSelector(videoTrackSelectionFactory);
    SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this,trackSelector);

    PlayerView playerView = findViewById(R.id.simple_player);

    playerView.setPlayer(player);

    /*
      Create RTMP Data Source
     */

    RtmpDataSourceFactory rtmpDataSourceFactory = new RtmpDataSourceFactory();


    MediaSource videoSource = new ExtractorMediaSource.Factory(rtmpDataSourceFactory)
            .createMediaSource(Uri.parse(url));

    player.prepare(videoSource);

    player.setPlayWhenReady(true);

对此的任何帮助将不胜感激。

解决方法

大多数在线视频流使用自适应比特率流 (ABR) 协议来传输视频,目前主要是 HSL 和 DASH。

大多数媒体播放器(如 ExoPlayer)都很好地支持这些协议,尽管它们是复杂且不断发展的协议,因此总是存在边缘情况。

许多视频会议应用程序使用 WebRTC,这是一种实时优化的协议 - 通常的方法是将 WebRTC 客户端用于此类流。

从流式传输延迟的角度来看,这两种方法之间的区别在非常的高度上是:

  • ABR 协议优先考虑质量并避免中断,并缓冲足够的视频以确保不间断播放。它们通常针对电影和直播视频流服务。即使对于低延迟实施,延迟也是以几秒甚至更多的时间来衡量的。

  • WebRTC 优先考虑延迟并在必要时牺牲质量。它通常针对实时敏感的应用程序,如视频会议,重要的是不要落后于讨论,即使这意味着暂时的视频故障甚至视频的短暂中断。延迟通常以亚秒为单位。

任何媒体服务器都来自 WebRTC 端,尽管最近的版本支持 HLS /CMAF 和低延迟 DASH(如上所述,这些通常仍然比 WebRTC 延迟更高)。

对于您的服务,如果您能够使用 DASH 或 HLS 流,您可能会发现使用 ExoPlayer 更容易。例如,如果您查看演示应用程序,您将看到 DASH 和 HLS 流,但没有 RTMP 流。您可以轻松扩展或修改演示应用程序以播放您自己的 HLS 或 DASH 流,这通常是一种简单的开始方式 - 查看 assets/media.exolist.json 中的示例材料并添加您自己的 URL:

但是,如果这是您的首选路线,ExoPlayer 还应通过扩展支持 RTMP - 有一个特定的扩展允许这样做:

理论上,您只需将此依赖项添加到您的应用程序中即可:

如果您的应用程序使用的是 DefaultDataSource 或 DefaultDataSourceFactory,则添加对 RTMP 流的支持就像向 RTMP 扩展添加依赖项一样简单

检查此存储库中的问题列表是否有任何最近的问题和/或解决方法是值得的。