Android 媒体提取器 RTSP

6

我正在尝试开发一个应用程序,通过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)


你找到了Mediaextractor的可行替代方案吗? - Mohammad Fneish
@MohammadFneish 我目前正在研究在Android上使用FFMpeg,使用此项目https://github.com/WritingMinds/ffmpeg-android。我能够连接并从RTSP流中提取视频。但是一个限制是一次只能使用一个FFMpeg命令。 - Morepork
感谢回复,这个库不支持我的目标设备 arm-v8。 - Mohammad Fneish
1个回答

3

是的,我已经看到了,但我不明白为什么RTSP对于VideoView可以正常工作,而他们会将MediaExtractor锁定在仅限HTTP。虽然文档中有这个类似的方法,但它没有在文档中提到HTTP,但这也不起作用。https://developer.android.com/reference/android/media/MediaExtractor#setDataSource(android.content.Context,%20android.net.Uri,%20java.util.Map%3Cjava.lang.String,%20java.lang.String%3E)。RTSP在支持的媒体格式中有提到https://developer.android.com/guide/topics/media/media-formats#network。 - Morepork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接