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

时间:2012-01-19 10:55:19

标签: android video-streaming rtsp android-mediaplayer

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

从调试和回调中我可以看到实时数据到达设备<开始mMediaPlayer.prepareAsync()后1秒。这是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(2s和8s)中发现了一些高水位和低水位。作为一个快速测试,我已经破解了libstagefright.so来制作这些0.1和1。然而,这对延迟没有影响。我的搜索继续......

3 个答案:

答案 0 :(得分:1)

我没有给出最终答案,但让我分享现在的情况。

  • 我在PC上本地播放了5s延迟问题,从GStreamer到GStreamer。将以下参数添加到管道后,延迟消失了:
    • on client - latency=0参数rtspsrc;
    • 在服务器上 - v4l2src的{​​{1}}参数,当然还有is-live=1

无法控制x264enc tune=zerolatency / MediaPlayer的编解码器/媒体源参数。据我所知,在MediaCodec API中都没有。

所以我们需要选择GStreamer或ffmpeg。

还要找到易用性和便携性。

答案 1 :(得分:0)

我面临同样的问题。解决这个问题的一种方法是重写整个回放类,以便控制输入编解码器的内容。但这将是最后(也是痛苦的)度假胜地。我还在四处寻找......叹息......

答案 2 :(得分:0)

我遇到了完全相同的问题。起初我认为它无法正常工作,但我忘记了我的应用程序已打开,一段时间后视频出现了。

有趣的是,如果我使用我在VideoView教程中找到的这个视频[1],滞后要小得多。我正在考虑安装Darwin Streaming服务器以检查它是否属于VLC或其他问题。

[1] rtsp://v5.cache1.c.youtube.com/CjYLENy73wIaLQnhycnrJQ8qmRMYESARFEIJbXYtZ29vZ2xlSARSBXdhdGNoYPj_hYjnq6uUTQw=/0/0/0/video.3gp