2

我的目标是让计算机将视频从 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 端进行更改?

4

2 回答 2

0

尝试来自 VLC 的 http 流。转码时您永远无法消除所有延迟,但应该能够将其降低到 < 10 秒。

于 2013-02-15T20:39:34.107 回答
-1

我不确定您是否可以使用VideoView. Android 的 RTSP 支持似乎很弱:当我尝试播放 VLC 生成的视频流时,我不断收到“不支持的格式”错误,即使 VLC(和其他播放器)可以很好地处理流。

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

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

于 2014-09-25T20:06:13.737 回答