我需要确定媒体播放器是否正在使用 opencore 媒体框架,以便我可以禁用对我的流的搜索。 opencore 框架似乎在搜索时无声无息地失败了,我很难相信他们允许将其投入生产,但事实似乎确实如此。
我希望这就像确定他们的 SDK 版本一样简单,但是具有 api 8 的机器人手机似乎仍在使用 opencore,因此似乎不是一个好的选择。有什么想法吗?
编辑:
在耶稣的回应之后,我想出了这段代码。到目前为止,它似乎在我的测试中运行良好。如果有人认为这不是寻找流的可靠方法,请告诉我
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();
}
}
}
最佳答案
该方法不适用于 Samsung Galaxy S,它表示 Stagefright 已启用但未使用它,至少不用于流式传输。更安全的检查是打开本地套接字并将 MediaPlayer 连接到它,然后查看它报告为用户代理的内容。
例如,这是我在 Samsung Galaxy S 和 2.2 模拟器上看到的;
银河 S: 用户代理:CORE/6.506.4.1 OpenCORE/2.02 (Linux;Android 2.2)
模拟器: 用户代理: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();
关于android - 确定 mediaplayer 的 opencore 或 stagefright 框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4579885/