【问题标题】:Video stream lag and disconnect with videoview using ip camera stream视频流滞后并使用 ip 摄像头流与 videoview 断开连接
【发布时间】:2016-01-26 08:08:16
【问题描述】:

所以我有一个 IP 摄像机,它可以输出可以通过 rtsp 协议连接的视频流。我想在我的 android 应用程序中显示它,所以我使用以下代码设置了一个视频视图;

VideoView vv = (VideoView)this.findViewById(R.id.videoView);
    Uri uri = Uri.parse("rtsp://username:password@192.168.0.1:554/1/stream3");
    vv.setVideoURI(uri);
    vv.requestFocus();
    vv.start();

我将它放在主 Activity 类的 onCreate() 中,因此当应用加载时,它会自动连接并开始流式传输。我对此的经验是它可以工作 - 但最终会变得不稳定,或者只是随机停止并且似乎永远不会再次恢复运行。我必须关闭应用程序并从内存中清除它并重新启动它才能恢复它 - 但不久之后它就会失去连接,这意味着它几乎没用。

我还发现触摸菜单或按钮等屏幕对象时似乎有点滞后,但这可能只是巧合 - 我不能肯定。

问题是来自同一网络上的 PC 的流是完美的,通过 VLC 使用相同的 URL。那么我做错了什么,有没有更好的处理流媒体视频的方法?我最终想将视频视图与一些重叠的文本和按钮结合起来,并可能在必要时截取屏幕截图。目前我很幸运,如果我能在视频中断前播放几秒钟的视频......

一些额外的cmets;

我在较长时间内运行它取得了一些成功 - 所以它并不总是很糟糕,这使得事情难以诊断。但是当它停止时,它就停止了。 如果丢失连接,videoview 是否会主动尝试重新连接? 有没有办法用进度指示器来证明这一点 - 所以它看起来不像什么都不做?

【问题讨论】:

    标签: android video video-streaming android-videoview ip-camera


    【解决方案1】:

    有点晚了,但对于其他有同样问题的人:尝试通过将侦听器设置为您的 VideoView 来进行调试?即onErroronCompletion等。

    例如:

    vv.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    Log.d("VideoViewError", Integer.toString(what)); 
                                       //logs the error you're running into
    
                 //You can also put a switch case here to 
                   determine what error it is running into exactly: 
                String errorString = "Media Player Error: ";
                switch (what) {
                    case MediaPlayer.MEDIA_ERROR_UNKNOWN: {
                        errorString += "Unspecified media player error. ";
                    }
                    case MediaPlayer.MEDIA_ERROR_SERVER_DIED: {
                        errorString += "Media server died. ";
                    }
                }
                switch (extra) {
                    case MediaPlayer.MEDIA_ERROR_IO: {
                        errorString += "File or network related operation error.";
                    }
                    case MediaPlayer.MEDIA_ERROR_MALFORMED: {
                        errorString += "Bitstream is not conforming to the related coding standard or file spec.";
                    }
                    case MediaPlayer.MEDIA_ERROR_UNSUPPORTED: {
                        errorString += "Bitstream is conforming to the related coding standard or file spec, but the media framework does not support the feature.";
                    }
                    case MediaPlayer.MEDIA_ERROR_TIMED_OUT: {
                        errorString += "Media operation timed out.";
                    }
                }
                Log.d(TAG, errorString);
                    return true;
                }
            });
    

    如果流是“结束”,你会得到一个onCompletion

    setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
             @Override
             public void onCompletion(MediaPlayer mp) {
                       Log.d("VideoViewError", "Media Player reached end of file");
             }
             }
            );
    

    您也可以使用setOnInfoListener 进行同样的操作,它可以让您在播放期间了解视频视图的状态。 (代码在这里:http://developer.android.com/reference/android/media/MediaPlayer.OnInfoListener.html

    也许不是您正在寻找的答案,但希望能引导您找到正确的答案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      相关资源
      最近更新 更多