6

Tôi đang cố gắng thực hiện mã hóa phần cứng (avc) của luồng NV12 bằng API Android MediaCodec.Bắt các bộ mã hóa QualComm hoạt động qua API MediaCodec

Khi sử dụng OMX.qcom.video.encoder.avc, độ phân giải 1280x720 và 640x480 hoạt động tốt, trong khi các sản phẩm khác (tức là 640x360, 320x240, 800x480) sản xuất thành phần chroma dường như bị thay đổi (vui lòng xem snapshot).

Tôi đã kiểm tra kỹ xem hình ảnh đầu vào có đúng không bằng cách lưu nó vào tệp jpeg. Sự cố này chỉ xảy ra trên các thiết bị QualComm (ví dụ: Samsung Galaxy S4).

Bất kỳ ai có hoạt động này đúng cách? Bất kỳ thiết lập/quirks bổ sung cần thiết?

+1

Android 4.3 đã thêm một số tính năng mới hữu ích và cũng đã thêm các thử nghiệm CTS cung cấp dữ liệu YUV vào 'MediaCodec'. Các thử nghiệm buffer-to-buffer và buffer-to-surface trong http://bigflake.com/mediacodec/#EncodeDecodeTest có thể mang tính thông tin. – fadden

+1

BTW, có thảo luận trong nhóm Google nền tảng Android đề cập đến bộ mã hóa QualComm: https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJ Một trong những người nhận xét cho biết rằng máy bay chroma phải được căn chỉnh bởi ranh giới 2048 byte, nhưng điều đó chỉ hoạt động một phần cho tôi. Một số độ phân giải vẫn còn lỗi, ví dụ 176x144. –

Trả lời

3

Bộ giải mã (MediaCodec) có MediaFormat, nó có thể được nhận bằng cách sử dụng getOutputFormat. Ví dụ trả về có thể được in để đăng nhập. Và ở đó bạn có thể thấy một số thông tin hữu ích. Ví dụ trong trường hợp giá trị của bạn như "slice-height" có thể hữu ích. Tôi nghi ngờ rằng nó bằng với chiều cao cho 1280x720 và 640x480 và khác với độ phân giải khác. Có lẽ bạn nên sử dụng giá trị này để có được bù đắp sắc độ.

+0

Để khắc phục nhanh, tôi đã thay đổi độ phân giải theo những gì tôi thấy trong 'lát cắt chiều cao' và 'sải chân' của bộ giải mã. Ví dụ: 640x384 thay vì 640x360 và 384x256 thay vì 320x200. Sau đó, nó làm việc tốt :) Cảm ơn! – badbadboy

+0

@badbadboy bạn đã tìm ra cách để tính toán động và độ nghiêng sliceHeight cho độ phân giải cố định cho bộ mã hóa Qualcomm? – dmarcato

+0

@dmarcato Chưa xem xét điều đó .. – badbadboy

3

Đúng, OMX.qcom.video.encoder.avc thực hiện điều đó chứ không phải trên tất cả các thiết bị/phiên bản Android. Trên Nexus 4 của tôi với Android 4.3 bộ mã hóa hoạt động tốt, nhưng không phải trên S3 của tôi (chạy 4.1)

Giải pháp cho S3 chạy 4.1 với OMX.qcom.video.encoder.avc (có vẻ như một số S3 có bộ mã hóa khác) là thêm 1024 byte ngay trước khung Chroma.

// The encoder may need some padding before the Chroma pane 
int padding = 1024;      
if ((mWidth==640 && mHeight==480) || mWidth==1280 && mHeight==720) padding = 0; 

// Interleave the U and V channel 
System.arraycopy(buffer, 0, tmp, 0, mYSize); // Y 
for (i = 0; i < mUVSize; i++) { 
    tmp[mYSize + i*2 + padding] = buffer[mYSize + i + mUVSize]; // Cb (U) 
    tmp[mYSize + i*2+1 + padding] = buffer[mYSize + i]; // Cr (V) 
} 
return tmp; 

Máy ảnh đang sử dụng YV12 và bộ mã hóa COLOR_FormatYUV420SemiPlanar.

ảnh chụp của bạn cho thấy cùng một loại đồ tạo tác tôi đã có, bạn có thể cần một hack tương tự đối với một số nghị quyết, có lẽ với một chiều dài đệm

Bạn cũng nên tránh các nghị quyết mà không phải là một bội số của 16, ngay cả trên 4.3 rõ ràng (http://code.google.com/p/android/issues/detail?id=37769)!

+0

Tôi làm cách nào để xác định mYSize và mUVSize? –

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