Декодирование живого RTSP-потока: большая задержка видео с помощью MediaPlayer на Android - PullRequest
8 голосов
/ 19 января 2012

Я играю поток Live RTSP из VLC на ПК в класс Android MediaPlayer (оба в одной локальной сети). Он воспроизводится без ошибок - проблема в том, что декодированное видео на экране отстает от 5 до 7 секунд.

Из отладки и обратных вызовов я вижу, что живые данные поступают на устройство <1 с после запуска <code>mMediaPlayer.prepareAsync(). Это когда класс MediaPlayer начинает выяснять, в каком формате находится поток, с какими измерениями и т. Д. Затем, непосредственно перед тем, как видео отображается на экране (спустя 5-7 секунд), вызывается onPrepared(), где я вызываю mMediaPlayer.start(). Похоже, что start() воспроизводит видео, которое было первоначально снято с начала этапа подготовки.

Я пробовал seekTo(5000) как до, так и после start(), но это никак не влияет на лаг.

Для приложения для видеосвязи в режиме реального времени задержка установки в несколько секунд вполне приемлема, но эта задержка после представления видео для меня неприемлема.

public void surfaceCreated(SurfaceHolder holder)
{
   mMediaPlayer = new MediaPlayer();
   mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
   mMediaPlayer.setOnInfoListener(this);
   mMediaPlayer.setOnErrorListener(this);
   mMediaPlayer.setOnVideoSizeChangedListener(this);
   mMediaPlayer.setOnBufferingUpdateListener(this);
   mMediaPlayer.setDataSource("rtsp://192.168.1.4:5544/test");
   mMediaPlayer.setDisplay(holder);
   mMediaPlayer.setScreenOnWhilePlaying(true);
   mMediaPlayer.setOnPreparedListener(this);
   mMediaPlayer.setOnCompletionListener(this);
   mMediaPlayer.prepareAsync();
   ...
public void onPrepared(MediaPlayer mediaplayer)
{
   mMediaPlayer.start();
...

Любые идеи, как я могу уменьшить это отставание или стремиться к концу того, что буферизовано MediaPlayer? Мое устройство 3.1, minSdkVersion 2.2.

РЕДАКТИРОВАТЬ:

Я обнаружил некоторые высокие и низкие отметки уровня воды в AwesomePlayer.cpp (2 и 8). В качестве быстрого теста я взломал libstagefright.so, чтобы получить эти 0,1 с и 1 с. Это, однако, не повлияло на задержку. Мой поиск продолжается ...

Ответы [ 3 ]

1 голос
/ 15 июля 2013

Я не даю окончательного ответа, но позвольте мне поделиться тем, что у меня есть.

  • У меня была проблема с задержкой 5 с, играющая локально на ПК, от GStreamer до GStreamer. Задержка исчезла после добавления следующих параметров в конвейеры:
    • на клиенте - latency=0 параметр rtspsrc;
    • на сервере - v4l2src is-live=1 параметр и, конечно, x264enc tune=zerolatency.

Нет способа контролировать параметры кодека / источника медиа MediaPlayer / VideoView. Насколько я вижу, ни в MediaCodec API.

Так что нам нужно перейти на GStreamer или ffmpeg.

Простота использования и портативность еще предстоит выяснить.

0 голосов
/ 02 февраля 2012

У меня точно такая же проблема. Сначала я подумал, что это не работает, но я забыл, что мое приложение открылось, и через некоторое время появилось видео.

Самое смешное, что если я использую это видео [1], которое я нашел в руководстве по VideoView, отставание будет намного меньше. Я думаю об установке сервера потоковой передачи Darwin, чтобы проверить, является ли это вопросом VLC или другой проблемой.

[1] rtsp: //v5.cache1.c.youtube.com/CjYLENy73wIaLQnhycnrJQ8qmRMYESARFEIJbXYtZ29vZ2xlSARSBXdhdGNoYPj_hYjnq6uUTQw=/0.30p0/1005

0 голосов
/ 30 января 2012

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

...