2014-10-08 615 views
5

我們有一個Android應用程序,可將視頻編碼爲H264。在所有以前嘗試過的Android設備上,這將編碼爲基線配置文件,這正是我所需要的。使用MediaCodec和MTK編解碼器編碼時選擇H264配置文件

對聯想瑜伽10編解碼器是OMX.MTK.VIDEO.ENCODER.AVC。這會將視頻編碼爲High Profile,這會給接收設備帶來問題。

我正在使用MediaCodec。似乎沒有辦法設置要使用的配置文件。

有沒有辦法做到這一點?該編解碼器聲稱支持基線配置文件,但無法使用它。有沒有一個編解碼器的具體參數呢?

回答

3

您可以嘗試的是將密鑰profile添加到您的MediaFormat,值爲1OMX_VIDEO_AVCProfileBaseline)。如果你這樣做,你可能還需要添加一個密鑰level以及與你的分辨率匹配的等級值(來自OMX AVC等級常量的值)。

我不知道如果這實際上編解碼榮譽的請求的值,雖然,但它可能是值得一試。

參見https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/ACodec.cppsetupAVCEncoderParameters功能有關的設置過程的例子。它會在輸入參數(從您提供的MediaFormat中複製)中尋找profile鍵,但如果存在此參數,則還需要提供level參數,以及使用的級別取決於您的分辨率。有關可用於參數的常數值,請參閱https://android.googlesource.com/platform/frameworks/native/+/cde4b13a/include/media/openmax/OMX_Video.h

但檢查類和級參數後,它似乎也覆蓋配置文件,無論什麼設置的基線。因此,無論這些行是否已從您的設備中刪除,或者編碼器完全忽略了h264type.eProfile字段。

如果有人得到了一個源代碼樹更接近什麼是真正的設備上使用,它甚至會更好,用來檢查。

至於如何選擇適合您的分辨率適當的水平爲例,在http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c;h=1a40b71284看看x264_validate_levels(但需要使用OMX_VIDEO_AVCLEVELTYPE常數來表示傳給MediaFormat的水平)。

不知道這是否有幫助,但它至少值得一試。

+0

感謝您的回答mstorsjo。目前我正忙於其他事情。我會研究你的建議 – 2014-10-15 09:45:49

+0

即使我在Lenova 7000上也有同樣的問題 - 一個設備,你的建議運行良好。謝謝。 – 2015-06-18 10:36:18

0

我已經試過Nexus 9與Nvidia HW編碼器。唯一適用於我的是按名稱選擇編碼器。我能夠情景模式設置爲編碼器級別選擇的值總是設置爲13

請注意,如果您按類型選擇編碼器,它會選擇谷歌的編碼器和如上面提到的,它迫使輪廓基線。

1

下面是我在我的應用程序做了一個片段:

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

這裏是配置文件值,你可以選擇:

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 

而且層次:

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 

設置兩者都很重要。