2014-10-08 9 views
5

Wir haben eine Android App, die Video in H264 kodiert. Auf allen zuvor ausprobierten Android-Geräten entspricht dies dem Baseline-Profil, was ich brauche.Wählen Sie H264 Profil beim Kodieren mit MediaCodec und MTK Codec

Auf dem Lenovo Yoga 10 ist der Codec OMX.MTK.VIDEO.ENCODER.AVC. Dies codiert das Video als High Profile, was ein Problem für das Empfangsgerät darstellt.

Ich verwende MediaCodec. Es scheint keine Möglichkeit zu geben, das zu verwendende Profil festzulegen.

Gibt es eine Möglichkeit, dies zu tun? Der Codec erhebt den Anspruch, das Baseline-Profil zu unterstützen, bietet aber keine Möglichkeit, es zu verwenden. Gibt es einen Codec-spezifischen Parameter dafür?

Antwort

3

Was Sie versuchen könnten ist, den Schlüssel profile zu Ihrem MediaFormat hinzuzufügen, mit einem Wert von 1 (OMX_VIDEO_AVCProfileBaseline). Wenn Sie dies tun, müssen Sie wahrscheinlich auch den Schlüssel level mit einem Pegelwert hinzufügen, der Ihrer Auflösung entspricht (mit einem Wert aus den OMX AVC-Pegelkonstanten).

Ich bin nicht sicher, ob dieser Codec tatsächlich den angeforderten Wert ehrt, aber es könnte einen Versuch wert sein.

Die setupAVCEncoderParameters Funktion in https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/ACodec.cpp für ein Beispiel auf dem Setup-Verfahren. Es sucht nach dem Schlüssel profile in den Eingabeparametern (die von dem von Ihnen bereitgestellten MediaFormat kopiert werden), aber wenn dies vorhanden ist, müssen Sie auch einen level Parameter angeben, und welche Stufe zu verwenden ist, hängt von Ihrer Auflösung ab. Siehe https://android.googlesource.com/platform/frameworks/native/+/cde4b13a/include/media/openmax/OMX_Video.h für konstante Werte, die Sie für die Parameter verwenden können.

Aber nach dem Überprüfen der Profil- und Ebenenparameter scheint es auch das Profil auf Basislinie zu überschreiben, unabhängig davon, was eingestellt wurde. Entweder wurden diese Zeilen von Ihrem Gerät entfernt oder der Encoder ignoriert das Feld h264type.eProfile vollständig.

Wenn jemand einen Source-Tree hat, der näher an dem ist, was tatsächlich auf den Geräten verwendet wird, wäre es noch besser, dies zu überprüfen.

Als ein Beispiel, wie man ein geeignetes Maß für die Auflösung wählen, haben Sie einen Blick auf x264_validate_levels in http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c;h=1a40b71284 (unter Verwendung der OMX_VIDEO_AVCLEVELTYPE Konstanten ausgedrückt werden, aber das Niveau zu MediaFormat muss bestanden).

Nicht sicher, ob etwas davon hilft, aber es ist zumindest einen Versuch wert.

+0

Vielen Dank für Ihre Antwort mstorsjo. Ich bin gerade beschäftigt mit etwas anderem. Ich werde in Ihre Vorschläge schauen –

+0

Auch ich hatte das gleiche Problem in Lenova 7000-ein Gerät und Ihr Vorschlag hat gut funktioniert. Vielen Dank. –

0

Ich habe dies auf Nexus 9 mit Nvidia HW-Encoder versucht. Für mich funktioniert nur die Auswahl des Encoders nach Name. Ich bin in der Lage, das Profil auf den gewählten Wert für Encoder-Ebene ist immer auf 13 gesetzt.

Bitte beachten Sie, dass wenn Sie Encoder nach Typ wählen, wählt Google-Encoder und wie oben erwähnt, erzwungene Profil zu Grundlinie.

1

Hier ist ein Ausschnitt von dem, was ich in meiner app tat

mediaFormat.setInteger("profile", 8); // Profile HIGH 
mediaFormat.setInteger("level", 0x200); // Level 3.1 

Und hier sind die Profilwerte können Sie wählen aus:

OMX_VIDEO_AVCProfileBaseline = 0x01, /**< Baseline profile */ 
OMX_VIDEO_AVCProfileMain  = 0x02, /**< Main profile */ 
OMX_VIDEO_AVCProfileExtended = 0x04, /**< Extended profile */ 
OMX_VIDEO_AVCProfileHigh  = 0x08, /**< High profile */ 
OMX_VIDEO_AVCProfileHigh10 = 0x10, /**< High 10 profile */ 
OMX_VIDEO_AVCProfileHigh422 = 0x20, /**< High 4:2:2 profile */ 
OMX_VIDEO_AVCProfileHigh444 = 0x40, /**< High 4:4:4 profile */ 
OMX_VIDEO_AVCProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
OMX_VIDEO_AVCProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ 
OMX_VIDEO_AVCProfileMax  = 0x7FFFFFFF 

Und die Ebenen:

OMX_VIDEO_AVCLevel1 = 0x01,  /**< Level 1 */ 
OMX_VIDEO_AVCLevel1b = 0x02,  /**< Level 1b */ 
OMX_VIDEO_AVCLevel11 = 0x04,  /**< Level 1.1 */ 
OMX_VIDEO_AVCLevel12 = 0x08,  /**< Level 1.2 */ 
OMX_VIDEO_AVCLevel13 = 0x10,  /**< Level 1.3 */ 
OMX_VIDEO_AVCLevel2 = 0x20,  /**< Level 2 */ 
OMX_VIDEO_AVCLevel21 = 0x40,  /**< Level 2.1 */ 
OMX_VIDEO_AVCLevel22 = 0x80,  /**< Level 2.2 */ 
OMX_VIDEO_AVCLevel3 = 0x100, /**< Level 3 */ 
OMX_VIDEO_AVCLevel31 = 0x200, /**< Level 3.1 */ 
OMX_VIDEO_AVCLevel32 = 0x400, /**< Level 3.2 */ 
OMX_VIDEO_AVCLevel4 = 0x800, /**< Level 4 */ 
OMX_VIDEO_AVCLevel41 = 0x1000, /**< Level 4.1 */ 
OMX_VIDEO_AVCLevel42 = 0x2000, /**< Level 4.2 */ 
OMX_VIDEO_AVCLevel5 = 0x4000, /**< Level 5 */ 
OMX_VIDEO_AVCLevel51 = 0x8000, /**< Level 5.1 */ 
OMX_VIDEO_AVCLevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
OMX_VIDEO_AVCLevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ 
OMX_VIDEO_AVCLevelMax = 0x7FFFFFFF 

Es ist wichtig, beides einzustellen.

Verwandte Themen