实时RTSP流的解码:在Android上使用MediaPlayer的大视频延迟

bar*_*ide 8 android rtsp video-streaming android-mediaplayer

我正在播放从PC上的VLC到Android MediaPlayer类的Live RTSP流(两者都在同一本地网络上).它播放顺畅,没有错误 - 问题是屏幕上的解码视频落后于现场大约5到7秒.

从调试和回调中我可以看到实时数据在启动后<1s到达设备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();
...
Run Code Online (Sandbox Code Playgroud)

任何想法如何我可以减少这种滞后,或寻求到MediaPlayer缓冲的结束?我的设备是3.1,minSdkVersion是2.2.

编辑:

我在AwesomePlayer.cpp(2s和8s)中发现了一些高低水位标记.作为一个快速测试,我已经破解了libstagefright.so来制作这些0.1和1.然而,这对延迟没有影响.我的搜索继续......

Mik*_*keC 0

我面临着同样的问题。解决这个问题的一种方法是重写整个播放类,以控制输入编解码器的内容。但这将是最后(也是痛苦的)手段。我还在四处张望……叹息……