确定MediaPlayer使用的是Opencore还是Stagefright框架?

9
我需要确定媒体播放器是否使用opencore媒体框架,以便我可以禁用我的流媒体的搜索功能。看起来opencore框架在搜索方面会默默失败,我很难相信他们会允许这种情况发生在产品中,但似乎确实是这样。
我希望能够简单地确定他们的SDK版本,但似乎使用API 8的Android手机仍然使用opencore,因此这似乎不是一个好的选择。有什么想法吗?
编辑:
在Jesus的回复后,我想出了这段代码。到目前为止,在我的测试中它似乎工作得很好。如果有人认为这不是一种寻找流媒体的可靠方法,请告诉我。
    if (Build.VERSION.SDK_INT < 8) //2.1 or earlier, opencore only, no stream seeking
        mStreamSeekable = false;
    else { // 2.2, check to see if stagefright enabled
        mStreamSeekable = false;
        try {
                FileInputStream buildIs = new FileInputStream(new File("/system/build.prop"));
                if (CloudUtils.inputStreamToString(buildIs).contains("media.stagefright.enable-player=true"))
                    mStreamSeekable = true;
            } catch (IOException e) { //problem finding build file
                e.printStackTrace();
            }
        }
    } 

你好,如何获取CloudUtils类? - Huy Tower
@AlexTran 这应该会有帮助 https://dev59.com/UHVC5IYBdhLWcg3wZwJT - Jonathan S.
非常抱歉,我不知道你说的链接会找到什么。 - Huy Tower
4个回答

6

那种方法在三星Galaxy S上不起作用,它显示Stagefright已启用,但至少在流媒体方面并未使用它。更安全的检查方法是打开本地套接字并将MediaPlayer连接到它,然后查看它报告的User-Agent。

例如,在我的三星Galaxy S和2.2模拟器上,我看到的是:

Galaxy S: User-Agent: CORE/6.506.4.1 OpenCORE/2.02 (Linux;Android 2.2)

模拟器: User-Agent: stagefright/1.0 (Linux;Android 2.2)

在一个线程中,可以像这样做:

    volatile int socketPort;

    ServerSocket serverSocket = new ServerSocket(0);
    socketPort = serverSocket.getLocalPort();

    Socket socket = serverSocket.accept();

    InputStream is = socket.getInputStream();

    byte [] temp = new byte [2048];     
    int bsize = -1;
    while(bsize <= 0) {
        bsize = is.read(temp);
    }
    String res = new String(temp, 0, bsize);

    if(res.indexOf("User-Agent: stagefright") >= 0) {
        // Found stagefright
    }

    socket.close();
    serverSocket.close();

在另一个线程中,可以使用类似的方法(使上面的阻塞accept()调用返回);
    MediaPlayer mp = new MediaPlayer();
    mp.setDataSource(String.format("http://127.0.0.1:%d/", socketPort));
    mp.prepare();
    mp.start();

1
这个无法适用于所有手机,例如HTC手机有User-Agent: HTC Streaming Player [operator-code] / 1.0 / htc_pyramid / 2.3.3,其中没有提到stagefright - Samuel

2

在Android 2.3.5中,/system/build.prop文件中不再存在media.stagefright.enable-player属性。


1

你可以通过搜索来检测流媒体是否启用了stagefright。

media.stagefright.enable-http=true

而不是

media.stagefright.enable-player=true

1
要获取这些信息,您可以读取您设备上的文件/system/build.prop。在该文件中有一个名为media.stagefright.enable-player的参数。如果该参数设置为true,则表示stagefright处于活动状态,否则则表示您的设备正在使用opencore

看起来很有前途,但是在我测试的任何设备上Log.i(TAG,"Stagefright Enabled: " +System.getProperty("media.stagefright.enable-player")); //返回null。 - Jonathan S.
没错,抱歉。然后您需要打开build.prop文件并读取参数。 - Jesus Oliva

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