Я воспроизводю поток Live RTSP из VLC на ПК в класс Android MediaPlayer (оба в одной локальной сети). Он воспроизводится плавно, без ошибок - проблема в том, что декодированное видео на экране отстает от живого примерно на 5-7 секунд.
Из отладки и обратных вызовов я вижу, что оперативные данные поступают на устройство ‹ 1 с после запуска 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 с. Однако на задержку это никак не повлияло. Мои поиски продолжаются...