我正在尝试开发一个应用程序,通过RTSP(实时流媒体协议)从安全摄像机下载实时视频流。
我已成功连接到相机,并可以在VideoView
中查看视频。但是,我想要对数据流进行低级访问,因此一直在研究MediaExtractor
API。
当我将数据源设置为RTSP URI时,我收到一个IOException
- Failed to open file。这很令人困惑,因为这个URI在VideoView
和其他媒体播放器(如VLC)中都可以正常使用。我假设VideoView
必须在“幕后”使用相同的MediaExtractor
选项。请问MediaExtractor
支持RTSP吗?我期望我的RTSP URI可以被MediaExtractor
打开。我在文档中找不到不支持的地方。如果我遗漏了什么,请指点我正确的方向。我看到还有其他库可用,如FFmpeg、VLC和Live555,但如果可能的话,我希望使用Android SDK。
代码(Kotlin):
val extractor = MediaExtractor()
extractor.setDataSource("rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov")
错误:
2018-12-11 15:43:23.259 21127-21127/com.crichq.myactionreplayhub E/FileSource: Failed to open file 'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov'. (No such file or directory)
2018-12-11 15:43:23.260 21127-21127/com.crichq.myactionreplayhub D/AndroidRuntime: Shutting down VM
2018-12-11 15:43:23.262 21127-21127/com.crichq.myactionreplayhub E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.crichq.myactionreplayhub, PID: 21127
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.crichq.myactionreplayhub/com.crichq.myactionreplayhub.MediaExtractorActivity}: java.io.IOException: Failed to instantiate extractor.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.io.IOException: Failed to instantiate extractor.
at android.media.MediaExtractor.nativeSetDataSource(Native Method)
at android.media.MediaExtractor.setDataSource(MediaExtractor.java:202)
at com.crichq.myactionreplayhub.MediaExtractorActivity.onCreate(MediaExtractorActivity.kt:16)
at android.app.Activity.performCreate(Activity.java:7174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Android版本:
compileSdkVersion 28(Android 9.0)
Android测试设备:
三星Galaxy S7 Edge(运行Android 8.0.0)