2013-02-01 6 views
13

Meine App verwendet HLS, um Video von einem Server zu streamen, aber wenn ich den HLS-Stream vom Server anfordere, muss ich die maximale Videobitrate übergeben, die das Gerät verarbeiten kann. In der Android API guides heißt es, dass "die verfügbaren Videoaufzeichnungsprofile eines Geräts als Proxy für Medienwiedergabefähigkeiten verwendet werden können", aber wenn ich versuche, die videoBitRate für die rückwärtsgerichteten Kamera-Geräte abzurufen, kommt sie immer als 12Mb/s zurück das Gerät (Galaxy Nexus, Galaxy Tab Plus 7 ", Galaxy Tab 8.9), trotz der Tatsache, dass sie 3 verschiedene GPUs haben (PowerVR SGX540, Mali-400 MP, Tegra 250 T20). Hier ist mein Code, mache ich etwas falsch?Wie bekomme ich CamcorderProfile.videoBitRate für ein Android-Gerät?

CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
targetVideoBitRate = camcorderProfile.videoBitRate; 

Wenn ich versuche, diese auf dem Galaxy Tab plus-:

boolean hasProfile = CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH); 

es gibt True zurück, trotz der Tatsache, dass QUALITY_HIGH ist für 1080p-Aufnahme und die Spezifikationen sagen, dass es nur bei 720p aufnehmen kann.

+6

ein Handy, das mit dem Android-Betriebssystem gestartet werden soll, muss einige Werte wie diese bereitstellen. manchmal legen die Marken nur einen zufälligen Wert auf diese Felder. Ich hatte ein ähnliches Problem, als ich versuchte, den Blickwinkel des Kamera-Sichtfelds zu ermitteln, in dem Werte wie 10 Grad eingegeben wurden, was nicht nachvollziehbar ist. Sie haben wahrscheinlich das gleiche Problem. ihnen ist es scheiße. Sie wollen nur ein Smartphone auf den Markt bringen und kümmern sich nicht um Programmierer –

Antwort

7

Es sieht aus wie ich die Antwort auf meine eigene Frage gefunden habe.

Ich habe die documentation nicht genau genug gelesen, QUALITY_HIGH entspricht 1080p nicht, es ist einfach eine Möglichkeit, das höchste Qualitätsprofil anzugeben, das das Gerät unterstützt. Per Definition ist CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH) immer wahr. Ich sollte so etwas wie dieses geschrieben haben:

public enum mVideoQuality { 
    FullHD, HD, SD 
} 
mVideoQuality mMaxVideoQuality; 
int mTargetVideoBitRate; 

private void initVideoQuality { 
    if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_1080P)) { 
     mMaxVideoQuality = mVideoQuality.FullHD; 
    } else if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_720P)) { 
     mMaxVideoQuality = mVideoQuality.HD; 
    } else { 
     mMaxVideoQuality = mVideoQuality.SD; 
    } 
    CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
    mTargetVideoBitRate = cProfile.videoBitRate; 
} 

Die meisten meiner Geräte nach wie vor Unterstützung berichten für 1080p-Codierung, die ich bin skeptisch, aber lief ich diesen Code auf einem Sony Xperia Tipo (meine Low-End-Testgerät) und es wurde eine maximale Kodierqualität von 480p mit einer VideoBitRate von 720Kb/s gemeldet.

Wie gesagt, ich bin mir nicht sicher, ob jedes Gerät vertrauenswürdig ist, aber ich habe eine Reihe von Videobitraten von 720Kb/s bis 17Mb/s und Profilqualitäten von 480p - 1080p gesehen. Hoffentlich finden andere Leute diese Information nützlich.

+0

Bitte hinterlassen Sie einen Kommentar, wenn Sie Vorschläge zur Verbesserung meiner Antwort haben. –

+0

Volle Offenlegung: adogden und ich arbeiten an der gleichen Mannschaft. Ich habe ein Kopfgeld auf diese Frage gegeben, um uns zu helfen, dieses lästige Problem zu überwinden. Das hat wahrscheinlich dazu geführt, dass adogden noch einmal hinsieht und diese hilfreiche Antwort schreibt. Er hat das Kopfgeld verdient, und ich vergebe es ihm, ohne die Absicht zu haben, die Vertretung zu übertragen. –

Verwandte Themen