2014-10-08 16 views
5

Chúng tôi có một ứng dụng Android mã hóa video thành H264. Trên tất cả các thiết bị Android đã thử trước đây, mã này sẽ được mã hóa thành hồ sơ cơ bản, đó là những gì tôi cần.Chọn Cấu hình H264 khi mã hóa bằng MediaCodec và MTK Codec

Trên Lenovo Yoga 10 codec là OMX.MTK.VIDEO.ENCODER.AVC. Điều này mã hóa video là Cấu hình cao cung cấp sự cố cho thiết bị nhận.

Tôi đang sử dụng MediaCodec. Dường như không có cách nào để đặt cấu hình được sử dụng.

Có cách nào để thực hiện việc này không? Codec không yêu cầu hỗ trợ cấu hình Baseline nhưng không có cách nào để sử dụng nó. Có một tham số cụ thể codec cho điều này?

Trả lời

3

Những gì bạn có thể thử là thêm khóa profile vào MediaFormat của bạn, với giá trị là 1 (OMX_VIDEO_AVCProfileBaseline). Nếu bạn làm điều này, bạn có thể cũng cần thêm khóa level với giá trị cấp phù hợp với độ phân giải của bạn (với giá trị từ hằng số mức OMX AVC).

Tôi không chắc liệu codec này có thực sự tôn trọng giá trị được yêu cầu hay không nhưng có thể đáng thử.

Xem hàm setupAVCEncoderParameters trong https://android.googlesource.com/platform/frameworks/av/+/6ade04174/media/libstagefright/ACodec.cpp để biết ví dụ về quy trình thiết lập. Nó tìm kiếm khóa profile trong tham số đầu vào (được sao chép từ MediaFormat mà bạn đã cung cấp), nhưng nếu có, bạn cũng cần phải cung cấp thông số level và mức sử dụng tùy thuộc vào độ phân giải của bạn. Xem https://android.googlesource.com/platform/frameworks/native/+/cde4b13a/include/media/openmax/OMX_Video.h để biết giá trị không đổi bạn có thể sử dụng cho các tham số.

Nhưng sau khi kiểm tra thông số cấu hình và cấp độ, nó cũng có vẻ ghi đè cấu hình lên đường cơ sở bất kể những gì đã được đặt. Vì vậy, một trong hai dòng này đã bị xóa khỏi thiết bị của bạn hoặc bộ mã hóa sẽ bỏ qua trường h264type.eProfile hoàn toàn.

Nếu ai đó đã có một cây nguồn gần với những gì thực sự được sử dụng trên các thiết bị, nó sẽ là tốt hơn để kiểm tra đó.

Như một ví dụ về cách chọn một mức độ phù hợp với độ phân giải của bạn, có một cái nhìn tại x264_validate_levels trong http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c;h=1a40b71284 (nhưng mức độ truyền cho MediaFormat cần phải được thể hiện bằng cách sử dụng OMX_VIDEO_AVCLEVELTYPE hằng).

Bạn không chắc chắn liệu điều này có hữu ích hay không, nhưng ít nhất cũng đáng để thử.

+0

Cám ơn mstorsjo câu trả lời của bạn. Tôi đang bận rộn với một cái gì đó khác hiện nay. Tôi sẽ xem xét các đề xuất của bạn –

+0

Ngay cả khi tôi gặp vấn đề tương tự trong thiết bị Lenova 7000-a và đề xuất của bạn hoạt động tốt. Cảm ơn. –

0

Tôi đã thử tính năng này trên Nexus 9 với bộ mã hóa Nvidia HW. Chỉ có điều mà làm việc cho tôi là chọn bộ mã hóa theo tên. Tôi có thể đặt cấu hình thành giá trị được chọn cho cấp bộ mã hóa luôn được đặt thành 13.

Xin lưu ý rằng nếu bạn chọn bộ mã hóa theo loại, nó sẽ chọn bộ mã hóa google và như đã đề cập ở trên, nó sẽ tạo cấu hình cho đường cơ sở.

1

Dưới đây là một đoạn của những gì tôi đã làm trong ứng dụng của tôi:

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

Và đây là những giá trị hồ sơ bạn có thể chọn từ:

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 

Và mức:

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 

Điều quan trọng là phải đặt cả hai.

Các vấn đề liên quan