2011-01-02 3 views
9

Ich muss feststellen, ob ein Mediaplayer das Opencore-Media-Framework verwendet, so dass ich die Suche nach meinen Streams deaktivieren kann. Der Opencore-Rahmen scheint still mit dem Suchen zu versagen, was mir schwer fällt zu glauben, dass sie in die Produktion erlaubt haben, aber das scheint trotzdem der Fall zu sein.Opencore- oder Stagefright-Framework für Mediaplayer ermitteln?

Ich wünschte, es wäre so einfach wie die Bestimmung ihrer SDK-Version, aber Droid-Telefone, die api 8 scheinen Opencore noch zu verwenden, so scheint nicht eine gute Option zu sein. Irgendwelche Ideen?

EDIT:

Nach der Antwort von Jesus, kam ich mit diesem Code auf. Es scheint in meinen bisherigen Tests gut zu funktionieren. Wenn jemand glaubt nicht, dass es eine solide Methode ist Ströme für die Suche nach, lassen Sie mich wissen

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(); 
      } 
     } 
    } 
+0

Hallo, Wie CloudUtils Klasse haben? –

+0

@AlexTran Dies sollte http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string helfen –

+0

Wirklich leid, ich weiß nicht, was meinst du, was ich von der Verbindung finden werde . –

Antwort

6

Diese Methode funktioniert nicht auf dem Samsung Galaxy S, das besagt, dass Stagefright aktiviert ist, aber es nicht verwendet, zumindest nicht für das Streaming. Eine sicherere Überprüfung besteht darin, einen lokalen Socket zu öffnen und den MediaPlayer damit zu verbinden und zu sehen, was er als User-Agent meldet.

Zum Beispiel, das sehe ich auf meinem Samsung Galaxy S und dem 2.2 Emulator;

Galaxy S: User-Agent: CORE/6.506.4.1 Opencore/2.02 (Linux, Android 2.2)

Emulator: User-Agent: stagefright/1.0 (Linux; Android 2.2)

In einem Thread, tun Sie etwas wie das;

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(); 

Und so in einem anderen Thread (macht die Blockierung accept() Aufruf oben zurück);

MediaPlayer mp = new MediaPlayer(); 
    mp.setDataSource(String.format("http://127.0.0.1:%d/", socketPort)); 
    mp.prepare(); 
    mp.start(); 
+1

Können Sie den Code dafür zeigen? –

+1

das funktioniert nicht für alle Telefone zum Beispiel HTC Telefone hat ** User-Agent: HTC Streaming Player [Betreibercode]/1.0/htc_pyramid/2.3.3 **, die nicht ** Lampenfieber ** erwähnt haben. – Samuel

1

Um diese Informationen zu erhalten Sie die Datei /system/build.prop Ihres Geräts lesen kann. In dieser Datei befindet sich ein Parameter mit dem Namen media.stagefright.enable-player. Wenn dieser Parameter auf "True" gesetzt ist, ist stagefright aktiv, andernfalls verwendet Ihr Gerät opencore.

+0

Sieht vielversprechend aus, aber Log.i (TAG, "Stagefright Enabled:" + System.getProperty ("media.stagefright.enable-player")); // gibt null auf jedem Gerät zurück, das ich teste –

+0

Das stimmt, tut mir leid. Dann müssen Sie die Datei build.prop öffnen und den Parameter lesen. –

1

Sie könnten in der Lage sein zu erkennen, ob stagefright für das Streaming bei der Suche nach

aktiviert ist
media.stagefright.enable-http=true 

statt

media.stagefright.enable-player=true 
2

Mit Android 2.3.5, jetzt der media.stagefright. enable-player-Eigenschaft existiert nicht in /system/build.prop