我想使用exoplayer来传输rtsp视频。我正在使用ExoMedia library这是一个Android Android ExoPlayer包装器。我有搜索stackoverflow但我没有找到任何好的答案。经过一些谷歌搜索后,我发现exoplayer不支持rtsp stream issue 55。 有没有办法使用exoplayer流式传输rtsp网址? 这是我的代码。
public class MainActivity extends AppCompatActivity implements OnPreparedListener{
EMVideoView emPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playVideo();
}
private void playVideo() {
emPlayer = (EMVideoView)findViewById(R.id.video_view);
emPlayer.setOnPreparedListener(this);
emPlayer.setVideoURI(Uri.parse("rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov"));
}
@Override
public void onPrepared() {
emPlayer.start();
Log.v("TAG","video is playing");
}
}
这是我的日志
com.google.android.exoplayer.ExoPlaybackException: com.google.android.exoplayer.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov
at com.google.android.exoplayer.SampleSourceTrackRenderer.maybeThrowError(SampleSourceTrackRenderer.java:262)
at com.google.android.exoplayer.SampleSourceTrackRenderer.maybeThrowError(SampleSourceTrackRenderer.java:148)
at com.google.android.exoplayer.ExoPlayerImplInternal.incrementalPrepareInternal(ExoPlayerImplInternal.java:273)
at com.google.android.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:203)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
at com.google.android.exoplayer.util.PriorityHandlerThread.run(PriorityHandlerThread.java:40)
Caused by: com.google.android.exoplayer.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov
at com.google.android.exoplayer.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:191)
at com.google.android.exoplayer.upstream.DefaultUriDataSource.open(DefaultUriDataSource.java:133)
at com.google.android.exoplayer.extractor.ExtractorSampleSource$ExtractingLoadable.load(ExtractorSampleSource.java:823)
at com.google.android.exoplayer.upstream.Loader$LoadTask.run(Loader.java:222)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.net.MalformedURLException: Unknown protocol: rtsp
at java.net.URL.<init>(URL.java:182)
at java.net.URL.<init>(URL.java:125)
at com.google.android.exoplayer.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:330)
at com.google.android.exoplayer.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:189)
at com.google.android.exoplayer.upstream.DefaultUriDataSource.open(DefaultUriDataSource.java:133)
at com.google.android.exoplayer.extractor.ExtractorSampleSource$ExtractingLoadable.load(ExtractorSampleSource.java:823)
at com.google.android.exoplayer.upstream.Loader$LoadTask.run(Loader.java:222)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
答案 0 :(得分:2)
ExoPlayer不支持RTSP流媒体。在这里你可以check这个。对于RTSP流,您需要使用其他一些库,如libvlc或其他。
答案 1 :(得分:1)
现在ExoPlayer支持RTSP - https://github.com/google/ExoPlayer/pull/3854
您也可以按照rtsp - https://github.com/google/ExoPlayer/pull/3854#issuecomment-377010803
查看示例应用答案 2 :(得分:0)
ExoPlayer在拉取请求中支持RTSP(您必须抓取本地副本,因为它尚未合并。)
我在库中发现并修复了一个小错误(一个班轮)(如果你看一下我注意到的拉动请求评论),但对于大多数想要获取某些东西的用户来说,这个问题更大就像Internet网络摄像头一样,拉取请求中的当前代码库不处理TCP流 - 只有UDP。
这意味着,如果任何一端都在防火墙或其他NAT实例之后,它将无法工作,对于移动网络上的基本上任何用户来说都是如此,而在WiFi上则很多(特别是如果摄像头是隔离,他们应该是他们臭名昭着的不安全!)
我正在努力看看我是否可以为他们的补丁补充一些补丁,但这可能需要一段时间;我之前没有挖过ExoPlayer代码,而且还有很多来理解它....
答案 3 :(得分:0)
实际上,当前的ExoPlayer版本不支持RTSP。但是,正如问题issue 55所示,存在一个有效的拉取请求#3854,以添加此支持。
同时,您可以克隆不支持RTSP(分支dev-v2-rtsp)的原始作者exoplayer fork:
elseif ($user['archived']=="1"){
echo "<script type='text/javascript'>alert('Sorry you are no longer an owner');</script>";
sleep(10);
header('location: https://some URL');
}
我已经对其进行了测试,并且效果很好。作者正在积极致力于解决许多用户所报告的问题,我希望RTSP支持在某个时候成为正式exoplayer的一部分。
答案 4 :(得分:0)
答案 5 :(得分:0)
这是一个老问题,但似乎很热门。从这里的历史可以看出,它不支持,报告支持,然后一些仍然有问题,另一些发现它有效。
我认为这反映了 RTSP 是一个功能丰富的规范,以及相关的 RTP 传输具有多个选项。
根据我的经验,ExoPlayer 可能会播放一个 URL,如果没有,那么 VLC 播放器 sdk 可能仍然可以播放它。我还没有看到 reveres 的情况 - 即 VLC 无法播放而 ExoPlayer 可以播放的内容,但这很可能也是这种情况。
我对新项目采取的方法是: