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

1Qu*_*ion 5 java video-streaming raspberry-pi android-studio android-videoview

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

主要活动:

@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();
            }
        });


    }
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

"uses-permission android:name="android.permission.INTERNET"
Run Code Online (Sandbox Code Playgroud)

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

1Qu*_*ion 5

所以我实际上在大约一周前找到了这个简单的解决方案,经过大约两周的搜索和询问,我注意到还有很多其他人在问同样的问题或寻找一个简单的答案,我想分享对我有用的方法。

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

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

mWebView = (WebView) findViewById(R.id.activity_main_webview);
mWebView.loadUrl(piAddr);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 谢谢,您关于在 Android 应用程序上使用动画服务进行视频流传输的想法对我的项目有很大帮助。感谢您发布您的代码。 (2认同)