Определите каркас opencore или stagefright для медиаплеера? - PullRequest
9 голосов
/ 02 января 2011

Мне нужно определить, использует ли медиаплеер среду мультимедиа 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();
            }
        }
    } 

Ответы [ 4 ]

6 голосов
/ 07 января 2011

Этот метод не работает на Samsung Galaxy S, который говорит, что Stagefright включен, но не использует его, по крайней мере, для потоковой передачи. Более надежная проверка - открыть локальный сокет и подключить к нему MediaPlayer и посмотреть, что он сообщает как User-Agent.

Например, это то, что я вижу на моем Samsung Galaxy S и эмуляторе 2.2;

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

Emulator: Пользователь-агент: 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();
2 голосов
/ 02 августа 2011

В Android 2.3.5 теперь свойство media.stagefright.enable-player не существует в /system/build.prop

1 голос
/ 31 марта 2011

Возможно, вы сможете определить, включен ли stagefright для потоковой передачи, выполнив поиск

media.stagefright.enable-http=true

вместо

media.stagefright.enable-player=true
1 голос
/ 02 января 2011

Чтобы получить эту информацию, вы можете прочитать файл /system/build.prop вашего устройства. В этом файле есть параметр с именем media.stagefright.enable-player. Если для этого параметра установлено значение true, то stagefright активен, в противном случае ваше устройство использует opencore.

...