安卓 MediaExtractor RTSP

标签 android

我正在尝试开发一个应用程序,通过 RTSP(实时流协议(protocol))从安全摄像头下载实时视频流。

我已成功连接到相机并可以在 VideoView 中查看视频。但是,我想要对数据流进行低级访问,因此一直在研究 MediaExtractor API。

当我将数据源设置为 RTSP URI 时,我收到 IOException - 无法打开文件。这是令人困惑的,因为相同的 URI 在 VideoView 和其他媒体播放器(如 VLC)中正常工作。我假设 VideoView 必须在“幕后”使用相同的 MediaExtractor 选项。 MediaExtractor 是否支持 RTSP?我期待 MediaExtractor 打开我的 RTSP URI。我在文档中看不到任何不受支持的地方。如果我遗漏了什么,请指出正确的方向。我看到还有其他可用的库,例如 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)

最佳答案

MediaExtractor 仅支持 HTTP 或本地文件

https://developer.android.com/reference/android/media/MediaExtractor.html#setDataSource(java.lang.String)

public void setDataSource(字符串路径) 设置要使用的数据源(文件路径或 http URL)。

path String: 文件的路径,或者流的http URL

关于安卓 MediaExtractor RTSP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53716893/

相关文章:

android - LibGDX 纹理不会在 Android 4.3 上绘制

java inputStream一次只读取一个标签

android - 如何将数据从Sqlite迁移到Realm

android - Admob 广告显示在模拟器上但不是真实设备

java - 从 Android Studio 中的 fragment 更改整个应用程序主题

java - 当没有条件可显示的项目时隐藏 recyclerview

android - 如何在android studio上的textview中启用c代码的语法突出显示?

android - 如何创建android手势的原始文件

Android : Difference between LocationManager. addProximityAlert() & LocationClient.addGeofences()

java - 相机不工作?