Как транслировать 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 раньше, и есть много чего понять....
Это старый вопрос, но он кажется актуальным. Из истории здесь видно, что он не поддерживался, сообщалось, что он поддерживается, тогда у некоторых все еще были проблемы, а другие обнаружили, что это работало.
Я думаю, это отражает то, что RTSP является довольно многофункциональной спецификацией, а также связанный с ним транспорт RTP, имеющий несколько опций.
По моему опыту, ExoPlayer может воспроизводить URL-адрес, и если это не так, sdk проигрывателя VLC все еще может воспроизводить его. Я не видел случая Reresres - то есть того, что VLC не может воспроизвести, что ExoPlayer может, но вполне возможно, что это тоже так.
Подход, который я бы выбрал для нового проекта:
- Сначала проверьте URL-адрес на проигрывателе VLC на ноутбуке.
- Если вышеуказанное работает, проверьте URL-адрес на проигрывателе VLC на Android: https://play.google.com/store/apps/details?id=org.videolan.vlc&amp;hl=en_IE&amp;gl=US.
- Если вышеперечисленное работает, проверьте, добавив URL-адрес в демонстрационный носитель ExoPlater в тестовом проигрывателе и протестируйте там: https://github.com/google/ExoPlayer/pull/3854#issuecomment-841167938
- Если вышеперечисленное работает, вы, вероятно, готовы - если нет, и он работал в проигрывателе VLC, тогда рассмотрите возможность использования проигрывателя VLC в своем приложении вместо этого: https://code.videolan.org/videolan/libvlc-android-samples