我正在开发一个应用程序,我已经使用了 google 的 ExoPlayer,它的工作方式就像魅力一样,现在我想在我的应用程序中添加 RTSP 支持,但使用 Exoplayer 我无法播放它,请任何人可以帮助我这个,如果有人有其他选择请与我分享。
val playerView = findViewById<PlayerView>(R.id.simple_player)
playerView.player = player
val rtmpDataSourceFactory = RtmpDataSourceFactory()
val url = mVideoPath
val videoSource = ExtractorMediaSource.Factory(rtmpDataSourceFactory)
.createMediaSource(Uri.parse("rtsp://192.168.1.74/12"))
player.prepare(videoSource)
player.playWhenReady = true
lOG
E/ExoPlayerImplInternal:源错误。 net.butterflytv.rtmp_client.RtmpClient$RtmpIOException 在net.butterflytv.rtmp_client.RtmpClient.open(RtmpClient.java:56) 在 com.google.android.exoplayer2.ext.rtmp.RtmpDataSource.open(RtmpDataSource.java:60) 在 com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83) 在 com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:885) 在 com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 java.lang.Thread.run(Thread.java:761)
似乎 RTSP 支持不适用于 常规 ExoPlayer 版本,他们仍然有 开放票证来添加 RTSP 支持,但是有一个 支持 RTSP 的 git 分支。
您正在使用 RtmpDataSourceFactory,您可以尝试使用 RtspMediaSource.Factory 来代替。
您还可以阅读RTMP 和 RTSP 之间的区别。
ExoPlayer 似乎已经为 Rtsp 流提供了补丁。我使用的是 ExoPlayer v2.15.0,这是最新的版本,其中包含 Rtsp 流媒体支持。但我们仍然无法传输“rtsp://192.168.0.26:554/11”此类网址。同时 VLC 也能够传输此类 url。
下面是我的一段代码,用于流式传输给定的 rtsp url
MediaSource mediaSource =
new RtspMediaSource.Factory().setForceUseRtpTcp(true)
.createMediaSource(MediaItem.fromUri("rtsp://192.168.0.26:554/11"));
遇到源错误。
日志: ExoPlayerImplInternal:播放错误 com.google.android.exoplayer2.ExoPlaybackException:源错误 引起原因:java.net.NoRouteToHostException:主机无法访问
注意:我们已将设备连接在同一网络内!!!
val rtspUri = "rtsp://"YOUR_IP_ADDRESS":"PORT"/stream1"
val mediaSource: MediaSource =
RtspMediaSource.Factory().createMediaSource(MediaItem.fromUri(rtspUri))
exoPlayer = SimpleExoPlayer.Builder(this).build()
exoPlayer.setMediaSource(mediaSource)
exoPlayer.prepare()
exoPlayer.playWhenReady = true
val playerView = findViewById<PlayerView>(R.id.exoPlayerView)
playerView.player = exoPlayer
}
override fun onDestroy() {
super.onDestroy()
// Release the player when the activity is destroyed.
exoPlayer.release()
}
//将您的设备连接到同一网络