6

aracılığıyla çalışmak için QualComm kodlayıcıları alıyorum Android MediaCodec API kullanarak NV12 akışının donanım kodlamasını (avc) yapmaya çalışıyorum. MediaCodec API

OMX.qcom.video.encoder.avc çözünürlükler 1280x720 ve 640x480 iyi iş kullanılarak diğerlerinin (yani, 640x360, 320x240, 800x480) kroma bileşeni kaydırılmış görünüyor çıktı üretmek ( snapshot bakınız).

Giriş görüntüsünün bir jpeg dosyasına kaydedilerek doğru olduğunu iki kez kontrol ettim. Bu sorun yalnızca Qualcomm aygıtlarında (yani Samsung Galaxy S4) gerçekleşir.

Bunu herkes düzgün şekilde çalışıyor mu? Herhangi bir ek kurulum/quirks gerekli?

+1

Android 4.3, bazı yararlı yeni özellikler ekledi ve YUV verilerini "MediaCodec" ile besleyen CTS testlerini de ekledi. Http://bigflake.com/mediacodec/#EncodeDecodeTest'deki tampondan arabelleğe ve tampondan sınama testleri bilgilendirici olabilir. – fadden

+1

BTW, Android platformunda Google QualComm kodlayıcılarından söz eden Google Grubu'nda tartışma var: https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJ Yorum yapanlardan biri, kroma düzleminin hizalanması gerektiğini belirtiyor 2048 bytes sınır, ama bu sadece benim için kısmen çalışır. Bazı kararlar, örneğin, hala buggy, 176x144 vardır. –

cevap

3

Dekoder (MediaCodec), MediaFormat'ına sahiptir, getOutputFormat kullanılarak alınabilir. İade edilen örnek günlüğe yazdırılabilir. Ve orada bazı yararlı bilgiler görebilirsiniz. Örneğin, sizin durumunuzda "dilim yüksekliği" gibi yararlı olabilir. 1280x720 ve 640x480 için yüksekliğe eşit olduğu ve diğer çözünürlükler için farklı olduğundan şüpheleniyorum. Muhtemelen chroma ofset almak için bu değeri kullanmalısınız.

+0

Hızlı bir düzeltme olarak, çözünürlükleri kod çözücünün 'dilim yüksekliğinde' ve 'adımda' gördüğüm şeye göre değiştirdim. Örneğin, 640x360 yerine 640x384 ve 320x200 yerine 384x256. Sonra iyi çalıştı :) Teşekkürler! – badbadboy

+0

@badbadboy, qualcomm enkoder için sabit bir çözünürlük verilen adım ve sliceHeight'ı dinamik olarak hesaplamanın bir yolunu buldunuz mu? – dmarcato

+0

@dmarcato Henüz bakmadım .. – badbadboy

3

Ypp, OMX.qcom.video.encoder.avc bunu yapar, ancak tüm aygıtlarda/android sürümünde değil. Android 4.3 ile Nexus 4'ümde kodlayıcı gayet iyi çalışıyor, fakat benim S3'ümde (çalışıyor 4.1)

OMX.qcom.video.encoder.avc ile çalışan bir S3 için çözüm (bazı S3'lerin varmış gibi görünüyor) Başka bir kodlayıcı), Chroma bölmesinden hemen önce 1024 bayt eklemektir.

// 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; 

kamera YV12 ve kodlayıcı COLOR_FormatYUV420SemiPlanar kullanıyor.

Kişisel anlık vardı eserler aynı tür, sen Ayrıca daha 4.3 üzerinde, 16 katları olmayan çözünürlükleri kaçınmalıdır

belki başka dolgu uzunluğunda, bazı çözünürlükler için benzer kesmek gerekebilir gösterir görünüşte (http://code.google.com/p/android/issues/detail?id=37769)!

+0

mYSize ve mUVSize'yi nasıl belirlerim? –