Я играю поток 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 с. Это, однако, не повлияло на задержку. Мой поиск продолжается ...