如何消除Android上VideoView中播放的RTSP流的延迟

时间:2013-01-23 23:21:36

标签: android android-videoview rtsp vlc lag

我的目标是让计算机将视频从usb网络摄像头传输到我自己的Android应用程序。

在PC上我正在运行VLC,它通过端口8554上的RTSP流式传输捕获设备(网络摄像头),具有以下设置:

Video Codec: H.264
Video Resolution: 1600x1200 x 0.25= 400 x 300 px
Video Frame Rate: 12 fps
Video Bitrate: 56 Kbps
and NO audio

我选择了非常低的设置,看它是否会改善延迟,但对滞后几乎没有影响。这是生成的输出流字符串VLC给我:

:sout=#transcode{vcodec=h264,vb=56,fps=12,scale=0.25,acodec=none}:rtp{sdp=rtsp://:8554/} :sout-keep

在onCreate方法的android端我有:

String url = "rtsp://192.168.1.103:8554/";
vid = (VideoView) findViewById(R.id.videoView1);
mc = new MediaController(this);
vid.setMediaController(mc);
vid.setVideoURI(Uri.parse(url));
vid.requestFocus();
vid.setOnPreparedListener(new OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer mp) {
        // TODO Auto-generated method stub
        vid.start();
    }
});

结果:

当应用程序加载时,VideoView全黑,大约10-20秒,而LogCat中会弹出两条消息:

Tag             Text
MediaPlayer     Couldn't open file on client side, trying server side
MediaPlayer     getMetadata

一旦显示视频,大约有20秒的延迟,大约30-60秒后视频仍然被冻结。视频开始播放后,这些消息也会出现:

Tag             Text
MediaPlayer     info/warning (3, 0)
MediaPlayer     Info (3, 0)

我还尝试使用VLC从同一网络上的另一台PC捕获流,似乎滞后仍然存在,但它永远不会冻结。不确定我是否应该使用其他RTSP服务器,例如Darwin?使用不同的协议,HTTP或RTP?或者如果在android端需要更改某些内容?

2 个答案:

答案 0 :(得分:0)

尝试来自VLC的http流。你不能在转码时删除所有延迟,但应该能够将其降低到< 10秒。

答案 1 :(得分:0)

我不确定您是否可以使用VideoView获得无滞后的解决方案。 Android的RTSP支持似乎非常弱:当我尝试播放VLC生成的视频流时,我不断收到“不支持的格式”错误,即使VLC(和其他播放器)可以正常处理该流。

当我们尝试使用http流时,我们得到了惊人的90秒延迟!

最后,我编写了自己的最小RTSP客户端,并将H264数据包直接传递给MediaCodec。这需要“相当多”的代码(3200多行)并且“合理”难度,但延迟时间远低于一秒。 (这是在硬件中进行H264编码的相机;软件编码器可能会产生更高的最小延迟。)