簡體   English   中英

使用MediaCodec和MTK編解碼器編碼時選擇H264配置文件

[英]Select H264 Profile when encoding with MediaCodec and MTK Codec

我們有一個Android應用程序,可將視頻編碼為H264。 在所有以前嘗試過的Android設備上,這都編碼為Baseline配置文件,這正是我所需要的。

在Lenovo Yoga 10上,編解碼器為OMX.MTK.VIDEO.ENCODER.AVC。 這會將視頻編碼為High Profile,這給接收設備帶來了問題。

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

有什么辦法嗎? 編解碼器確實聲稱支持基准配置文件,但是沒有使用它的方式。 是否有特定的編解碼器參數?

您可以嘗試將密鑰profile添加到MediaFormat中,值為1OMX_VIDEO_AVCProfileBaseline )。 如果這樣做,您可能還需要添加具有與分辨率匹配的級別值的鍵level (帶有來自OMX AVC級別常量的值)。

我不確定該編解碼器是否實際上遵守要求的值,但是可能值得嘗試。

有關設置步驟的示例,請參見https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/ACodec.cpp中setupAVCEncoderParameters函數。 它會在輸入參數(從您提供的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中的x264_validate_levels= 1a40b71284 (但是傳遞給MediaFormat的級別需要使用OMX_VIDEO_AVCLEVELTYPE常量表示)。

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

這是我在應用程序中所做的摘要:

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  

兩者都設置很重要。

我已經在配備Nvidia硬件編碼器的Nexus 9上進行了嘗試。 對我來說唯一有效的方法是按名稱選擇編碼器。 我可以將配置文件設置為所選值,因為編碼器級別始終設置為13。

請注意,如果您按類型選擇編碼器,則會選擇google編碼器,如上所述,它將配置文件強制設為基線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM