将实时视频从Raspberry Pi流式传输到我的Android应用程序,但获得安全性异常

时间:2017-03-08 17:54:52

标签: java android-studio raspberry-pi video-streaming android-videoview

我想将实时视频流式传输到我的Android应用。 我正在使用动作服务从我的覆盆子pi的相机(小型USB连接相机)流式传输实时视频。我为端口8082设置了它,因此我可以从任何浏览器成功输入(exampled IP)“http://74.220.185.125:8082”并查看我的视频流。但是,当我在使用videoView的应用程序的代码中使用它时,每次都会抛出异常。

MainActivity:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Starting video
        piVideo = (VideoView) findViewById(R.id.piVidView);

        try{
            piVideo.setVideoURI(Uri.parse("http://74.220.185.125:8082/"));
        } catch (Exception e){
            Log.e("Error found here->", e.getMessage());
            e.printStackTrace();
        }
        piVideo.requestFocus();
        piVideo.start();

        piVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override

            public void onPrepared(MediaPlayer mp) {
                piVideo.start();
            }
        });


    }

每一次,我都会遇到同样的错误:

03-08 12:46:49.258 1412-1412/com.me.blah.app D/MediaPlayer: setDataSource IOException | SecurityException happend : 
                                                                         java.io.FileNotFoundException: No content provider: http://74.220.185.125:8082/
                                                                             at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1141)
                                                                             at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:991)
                                                                             at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:914)
                                                                             at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1121)
                                                                             at android.widget.VideoView.openVideo(VideoView.java:371)
                                                                             at android.widget.VideoView.access$2100(VideoView.java:71)
                                                                             at android.widget.VideoView$7.surfaceCreated(VideoView.java:652)
                                                                             at android.view.SurfaceView.updateWindow(SurfaceView.java:712)
                                                                             at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:209)
                                                                             at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1014)
                                                                             at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2510)
                                                                             at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
                                                                             at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
                                                                             at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
                                                                             at android.view.Choreographer.doCallbacks(Choreographer.java:695)
                                                                             at android.view.Choreographer.doFrame(Choreographer.java:631)
                                                                             at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
                                                                             at android.os.Handler.handleCallback(Handler.java:739)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                             at android.os.Looper.loop(Looper.java:158)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我在清单文件中启用了INTERNET:

"uses-permission android:name="android.permission.INTERNET"

我已经尝试过rstp://和http://但两者最终都会抛出相同的异常。任何人都可以看到我的异常可能来自哪里?

1 个答案:

答案 0 :(得分:4)

所以我实际上在大约一周前找到了这个简单的解决方案。要求大约两个星期,我注意到还有很多人问同样的问题或寻找一个简单的答案,我想分享对我有用的东西。

我的搜索引导我使用videoView,但据我了解,videoView正在搜索特定文件和/或通常在远程服务器上创建的特定流文件类型。然而,运动服务并不容易提供文件或我正在寻找的细节,但是IP地址肯定在普通浏览器中工作,所以我尝试了webView,在motion.conf文件中调整了我的覆盆子pi的像素比率,并使用我的webView的尺寸玩,它工作得非常好。代码比我一直看到的例子容易得多,这就是我使用的:

String piAddr = "http://10.0.0.116:8081/"

mWebView = (WebView) findViewById(R.id.activity_main_webview);
mWebView.loadUrl(piAddr);

注意:我正在运行一个python脚本,在我的覆盆子pi上启动运动服务,似乎请求覆盆子pi运动服务端口的应用程序和实际启动的运动服务之间的时间稍微偏离,所以在我的整个过程中代码我只是定期重复以下行来验证我的视频是否成功流式传输。

此外,webView会自动显示滚动条,因此如果您看不到整个视频(底部有计时器),您可以随时在motion.conf文件中调整视频尺寸。