我想将实时视频流式传输到我的 Android 应用程序。 我正在使用运动服务从我的树莓派相机(小型 USB 连接相机)流式传输实时视频。我已将其设置为端口 8082,因此我可以从任何浏览器成功输入(示例 IP)“http://74.220.185.125:8082”并查看我的视频流。但是,当我在使用 videoView 的应用程序代码中使用它时,每次都会抛出异常。
主要 Activity :
@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)
我在 list 文件中启用了互联网:
"uses-permission android:name="android.permission.INTERNET"
我已经尝试了 rstp://和 http://并且两者仍然以抛出相同的异常而告终。任何人都可以看到我这个异常可能是从哪里引起的吗?
最佳答案
所以我实际上在大约一周前找到了这个简单的解决方案,经过大约两周的搜索和询问,我注意到还有很多其他人在问同样的问题或寻找一个简单的答案,我想分享有效的方法对我来说。
我的搜索引导我使用 videoView,但据我了解,videoView 正在搜索通常会在您的远程服务器上创建的特定文件和/或特定流文件类型。然而,motion 服务并没有提供我正在寻找的文件或详细信息,但 ip 地址在普通浏览器中肯定有效,所以我尝试了一个 webView,在 motion.conf 文件中调整了我在树莓派上的像素比例,并玩弄了我的 webView 的尺寸,它工作得很好。代码比我一直看到的示例简单得多,这就是我使用的代码:
String piAddr = "http://10.0.0.116:8081/"
mWebView = (WebView) findViewById(R.id.activity_main_webview);
mWebView.loadUrl(piAddr);
注意:我正在运行一个在我的树莓派上启动运动服务的 python 脚本,似乎应用程序请求树莓派运动服务端口和运动服务实际启动之间的时间略有偏差,所以在我的整个过程中代码 我只是定期重复以下行以验证我的视频是否成功流式传输。
此外,webView 有一个自动滚动条,所以如果您看不到整个视频(计时器在底部),您可以随时在 pi 上的 motion.conf 文件中调整视频尺寸。
关于java - 将实时视频从 Raspberry Pi 流式传输到我的 Android 应用程序但出现安全异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42678488/