我的目标是让电脑将usb摄像头上的视频流传输到我自己的android应用程序中。
在PC上,我正在运行VLC,它通过RTSP在端口8554上流式传输捕获设备(网络摄像头),设置如下:
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
在android端的onCreate方法中,我有:
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();
}
});
结果:
当应用程序加载时,在LogCat中弹出两条消息时,VideoView会在大约10-20秒内全部变黑:
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方面做出一些改变?
发布于 2013-02-16 04:39:34
尝试来自VLC的http流。在转码时,您永远无法消除所有的延迟,但应该能够将其降低到< 10秒。
发布于 2014-09-26 04:06:14
我不确定你是否能用VideoView
得到一个无滞后的解决方案。Android的RTSP支持似乎相当弱:当我试图播放VLC生成的视频流时,我一直收到“不支持的格式”错误,尽管VLC(和其他播放器)可以很好地处理该流。
当我们尝试http流媒体时,我们得到了惊人的90秒的延迟!
最后,我编写了自己的最小RTSP客户端,并将H264数据包直接传递给MediaCodec
。这需要相当多的代码(3200+代码行),难度也很大,但延迟还不到一秒。(这是在硬件中进行H264编码的相机;软件编码器可能会施加更高的最小延迟。)
https://stackoverflow.com/questions/14491245
复制相似问题