我正在播放从PC上的VLC到安卓MediaPlayer类的Live RTSP流(两者都在同一个本地网络上)。它播放流畅,没有错误-问题是,屏幕上解码的视频大约落后直播5到7秒。
从调试和回调中,我可以看到实时数据在启动mMediaPlayer.prepareAsync()后不到1秒就到达了设备。这就是MediaPlayer类开始计算流的格式和尺寸等的时候。然后在视频显示在屏幕上之前(5到7秒后),在我调用mMediaPlayer.start()的地方调用onPrepared()。看起来这个start()播放了最初在准备阶段开始时捕获的视频。
我在start()之前和之后都尝试过seekTo(5000),但它对延迟完全没有影响。
对于一个实时视频通话应用程序,几秒钟的设置延迟是完全可以的,但是一旦视频出现,这种延迟对我来说是不可接受的。
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。然而,这对延迟没有影响。我的搜寻还在继续。
发布于 2013-07-16 02:43:18
我不会给出最终的答案,但让我分享一下我现在所拥有的。
从GStreamer到GStreamer,
rtspsrc;latency=0参数-v4l2src的is-live=1参数,当然还有x264enc tune=zerolatency.
没有办法控制MediaPlayer/VideoView的编解码器/媒体源参数。据我所知,在MediaCodec API中也是如此。
因此,我们需要使用GStreamer或ffmpeg。
in FFMPEG 0.9在2011年实施了
硬件加速编解码器访问
易用性和可移植性还有待发现。
发布于 2012-01-30 09:46:21
我也面临着同样的问题。解决这个问题的一种方法是重写整个播放类,以便控制输入到编解码器中的内容。但这将是最后(也是痛苦的)手段。我还在四处张望。叹息..。
发布于 2012-02-02 15:34:48
我也遇到了同样的问题。起初我以为它不工作,但我忘记了我的应用程序打开了,一段时间后,视频显示出来。
有趣的是,如果我使用这个在VideoView教程中找到的video1,延迟就会小得多。我正在考虑安装Darwin流媒体服务器,以检查这是VLC问题还是其他问题。
1个rtsp://v5.cache1.c.youtube.com/CjYLENy73wIaLQnhycnrJQ8qmRMYESARFEIJbXYtZ29vZ2xlSARSBXdhdGNoYPj_hYjnq6uUTQw=/0/0/0/video.3gp
https://stackoverflow.com/questions/8924834
复制相似问题