我正在播放从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。然而,这对延迟没有影响。我的搜索继续......
答案 0 :(得分:1)
我没有给出最终答案,但让我分享现在的情况。
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