Задержка видеопотока и отключение при просмотре видео с использованием потока ip-камеры

Итак, у меня есть IP-камера, которая выводит видеопоток, к которому я могу подключиться по протоколу rtsp. Я хочу отобразить это в своем приложении для Android, поэтому я настроил видеопросмотр, используя следующий код:

VideoView vv = (VideoView)this.findViewById(R.id.videoView);
    Uri uri = Uri.parse("rtsp://username:[email protected]:554/1/stream3");
    vv.setVideoURI(uri);
    vv.requestFocus();
    vv.start();

Я помещаю это в onCreate() основного класса активности, поэтому, когда приложение загружается, оно автоматически подключается и начинает потоковую передачу. Мой опыт в этом заключается в том, что это работает, но в конечном итоге становится прерывистым и или просто останавливается случайным образом и, кажется, никогда не возвращается к работе снова. Мне нужно закрыть приложение, очистить его из памяти и перезапустить, чтобы вернуть его, но вскоре после этого оно теряет связь, что означает, что оно практически бесполезно.

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

Дело в том, что поток идеально подходит с ПК в той же сети через VLC, используя тот же URL. Итак, что я делаю неправильно, и есть ли лучший способ обработки потокового видео? В конечном итоге я хотел соединить видеопросмотр с наложенным текстом и кнопками и, возможно, делать скриншоты, когда это необходимо. На данный момент мне повезло, если я получаю видео на несколько секунд, прежде чем оно обрывается...

Некоторые дополнительные комментарии;

Мне удалось запустить его в течение более длительного периода времени, так что это не всегда плохо, что затрудняет диагностику. Но когда он останавливается, он останавливается. Видеопросмотр активно пытается восстановить соединение, если соединение было потеряно? Возможно, есть способ продемонстрировать это с помощью индикатора прогресса, чтобы не было похоже, что он ничего не делает?


person Ispep    schedule 26.01.2016    source источник


Ответы (1)


Немного поздно, но для других с той же проблемой: попробуйте отладить, настроив слушателей на ваш VideoView? то есть onError, onCompletion и т. д.

Например:

vv.setOnErrorListener(new MediaPlayer.OnErrorListener() {
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.d("VideoViewError", Integer.toString(what)); 
                                   //logs the error you're running into

             //You can also put a switch case here to 
               determine what error it is running into exactly: 
            String errorString = "Media Player Error: ";
            switch (what) {
                case MediaPlayer.MEDIA_ERROR_UNKNOWN: {
                    errorString += "Unspecified media player error. ";
                }
                case MediaPlayer.MEDIA_ERROR_SERVER_DIED: {
                    errorString += "Media server died. ";
                }
            }
            switch (extra) {
                case MediaPlayer.MEDIA_ERROR_IO: {
                    errorString += "File or network related operation error.";
                }
                case MediaPlayer.MEDIA_ERROR_MALFORMED: {
                    errorString += "Bitstream is not conforming to the related coding standard or file spec.";
                }
                case MediaPlayer.MEDIA_ERROR_UNSUPPORTED: {
                    errorString += "Bitstream is conforming to the related coding standard or file spec, but the media framework does not support the feature.";
                }
                case MediaPlayer.MEDIA_ERROR_TIMED_OUT: {
                    errorString += "Media operation timed out.";
                }
            }
            Log.d(TAG, errorString);
                return true;
            }
        });

Если поток «заканчивается», вы получите onCompletion

setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
         @Override
         public void onCompletion(MediaPlayer mp) {
                   Log.d("VideoViewError", "Media Player reached end of file");
         }
         }
        );

Вы можете сделать то же самое с setOnInfoListener, который позволяет узнать статус просмотра видео во время воспроизведения. (Коды находятся здесь: http://developer.android.com/reference/android/media/MediaPlayer.OnInfoListener.html)

Возможно, это не тот ответ, который вы ищете, но, надеюсь, он приведет вас к правильному ответу!

person jaydee713    schedule 21.03.2016