如何使用exoplayer流式传输rtsp url?

时间:2016-09-27 06:48:30

标签: android video-streaming android-videoview exoplayer

我想使用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) 

6 个答案:

答案 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)

现在 Exoplayer 从 2.14.0 版本开始正式支持 RTSP 更多详情here

答案 5 :(得分:0)

这是一个老问题,但似乎很热门。从这里的历史可以看出,它不支持,报告支持,然后一些仍然有问题,另一些发现它有效。

我认为这反映了 RTSP 是一个功能丰富的规范,以及相关的 RTP 传输具有多个选项。

根据我的经验,ExoPlayer 可能会播放一个 URL,如果没有,那么 VLC 播放器 sdk 可能仍然可以播放它。我还没有看到 reveres 的情况 - 即 VLC 无法播放而 ExoPlayer 可以播放的内容,但这很可能也是这种情况。

我对新项目采取的方法是:

  1. 首先在笔记本电脑上的 VLC 播放器上测试 URL。
  2. 如果上述方法有效,请在 Android 上的 VLC 播放器上测试 URL:https://play.google.com/store/apps/details?id=org.videolan.vlc&hl=en_IE&gl=US
  3. 如果上述方法有效,则通过将 URL 添加到测试播放器中的 ExoPlater 演示媒体并在那里测试:https://github.com/google/ExoPlayer/pull/3854#issuecomment-841167938
  4. 如果上述方法有效,您可能就可以开始了 - 如果无效并且它在 VLC 播放器中有效,那么请考虑在您的应用中使用 VLC 播放器:https://code.videolan.org/videolan/libvlc-android-samples