Как транслировать URL RTSP с помощью exoplayer?

Я хочу, чтобы потоковое видео RTSP, используя exoplayer. Я использую библиотеку ExoMedia, которая является оболочкой Android ExoPlayer. У меня есть поиск по stackru, но я не нашел хорошего ответа. После некоторого поиска в Google я обнаружил, что exoplayer не поддерживает выпуск 55 rtsp stream. Есть ли способ для потоковой передачи URL RTSP с помощью exoplayer? Вот мой код

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 ответов

Теперь ExoPlayer поддерживает RTSP - https://github.com/google/ExoPlayer/pull/3854

Также вы можете посмотреть пример приложения с помощью rtsp - https://github.com/google/ExoPlayer/pull/3854.

ExoPlayer не поддерживает потоковую передачу RTSP. Здесь вы можете проверить это. Для потоковой передачи RTSP вам нужно использовать некоторые другие библиотеки, такие как libvlc или что-то еще.

На самом деле текущая версия ExoPlayer не поддерживает RTSP. Но, как указано в выпуске 55, есть активная тяга #3854, чтобы добавить эту поддержку.

Тем временем вы можете клонировать оригинальный форк exoplayer авторов, который поддерживает RTSP (ветка dev-v2-rtsp):

git clone -b dev-v2-rtsp https://github.com/tresvecesseis/ExoPlayer.git.

Я проверил это, и он отлично работает. Авторы активно работают над устранением проблем, о которых сообщают многие пользователи, и я надеюсь, что поддержка RTSP в какой-то момент станет частью официального exoplayer.

ExoPlayer вроде поддерживает RTSP в запросе на извлечение (вам нужно получить локальную копию, поскольку она еще не объединена).

Есть небольшая ошибка (одна строка), которую я нашел и исправил в библиотеках (если вы посмотрите на комментарий к запросу на извлечение, я отметил, где он находится), но большая проблема для большинства пользователей, которые хотят получить что-то вроде интернет-камеры, заключается в том, что текущая кодовая база в запросе pull не обрабатывает потоковую передачу TCP - только UDP.

Это означает, что он не будет работать, если какой-либо конец находится за брандмауэром или другим экземпляром NAT, что будет иметь место в основном для любого пользователя в мобильной сети и многих в то время как в Wi-Fi (особенно, если камеры разделены, и они должны быть как они небезопасно!)

Я прилагаю некоторые усилия, чтобы увидеть, смогу ли я наложить некоторые патчи на их патчи, но это может занять некоторое время; Я не копался в коде ExoPlayer раньше, и есть много чего понять....

Теперь Exoplayer официально поддерживает RTSP, начиная с версии 2.14.0 Подробнее здесь

Это старый вопрос, но он кажется актуальным. Из истории здесь видно, что он не поддерживался, сообщалось, что он поддерживается, тогда у некоторых все еще были проблемы, а другие обнаружили, что это работало.

Я думаю, это отражает то, что RTSP является довольно многофункциональной спецификацией, а также связанный с ним транспорт RTP, имеющий несколько опций.

По моему опыту, ExoPlayer может воспроизводить URL-адрес, и если это не так, sdk проигрывателя VLC все еще может воспроизводить его. Я не видел случая Reresres - то есть того, что VLC не может воспроизвести, что ExoPlayer может, но вполне возможно, что это тоже так.

Подход, который я бы выбрал для нового проекта:

  1. Сначала проверьте URL-адрес на проигрывателе VLC на ноутбуке.
  2. Если вышеуказанное работает, проверьте URL-адрес на проигрывателе VLC на Android: https://play.google.com/store/apps/details?id=org.videolan.vlc&amp;amp;hl=en_IE&amp;amp;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
Другие вопросы по тегам