6

Android MediaCodec API를 사용하여 NV12 스트림의 하드웨어 인코딩 (avc)을 시도하고 있습니다.MediaCodec API를 통해 작동하도록 QualComm 인코더 받기

OMX.qcom.video.encoder.avc를 사용할 때 해상도 1280x720 및 640x480은 정상적으로 작동하지만 나머지 640x360, 320x240, 800x480은 채도가 이동 된 것처럼 보이는 출력을 생성합니다 (snapshot 참조).

jpeg 파일로 저장하여 입력 이미지가 올바른지 다시 확인했습니다. 이 문제는 QualComm 기기 (예 : 삼성 Galaxy S4)에서만 발생합니다.

누구나 올바르게 작동합니까? 추가 설정/단점이 필요합니까?

+1

Android 4.3에는 몇 가지 유용한 새로운 기능이 추가되었으며 YUV 데이터를 'MediaCodec'에 제공하는 CTS 테스트가 추가되었습니다. http://bigflake.com/mediacodec/#EncodeDecodeTest의 buffer-to-buffer 및 buffer-to-surface 테스트는 유익한 정보 일 수 있습니다. – fadden

+1

BTW, android-platform Google 그룹의 QualComm 인코더에 대한 토론이 있습니다. https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJ 의견 작성자 중 한 명은 채도 평면을 정렬해야한다고 말합니다. 2048 바이트 경계에 의해,하지만 그 부분적으로 나를 위해 작동합니다. 일부 해상도는 여전히 버그가 많습니다 (예 : 176x144). –

답변

3

디코더 (MediaCodec)의 MediaFormat은 getOutputFormat을 사용하여 수신 할 수 있습니다. 반환 된 인스턴스를 로그에 인쇄 할 수 있습니다. 그리고 거기에서 몇 가지 유용한 정보를 볼 수 있습니다. 예를 들어 "슬라이스 높이"와 같은 값은 유용 할 수 있습니다. 나는 그것이 1280x720과 640x480에 대한 높이와 같다고 생각하고 다른 해상도들에 대해 다르다. 아마도이 값을 사용하여 채도 오프셋을 가져야합니다.

+0

빠른 픽스로 디코더의 '슬라이스 높이'와 '보폭'에서 본 내용에 따라 해상도를 변경했습니다. 예 : 640x360 대신 640x384, 320x200 대신 384x256. 그럼 잘 했어 :) 고마워! – badbadboy

+0

@badbadboy Qualcomm 인코더의 고정 해상도에서 stride 및 sliceHeight를 동적으로 계산하는 방법을 찾았습니까? – dmarcato

+0

@dmarcato 아직 보지 못했습니다 .. – badbadboy

3

그래, OMX.qcom.video.encoder.avc는 모든 장치/안드로이드 버전에서 그러지는 않습니다. Android 4.3이 포함 된 Nexus 4에서 인코더가 정상적으로 작동하지만 내 S3 (4.1 실행)에 없습니다.

OMX.qcom.video.encoder.avc와 함께 실행되는 S3 용 솔루션 (일부 S3에는 다른 인코더)는 크로마 (Chroma) 창 바로 앞에 1,024 바이트를 추가하는 것입니다.

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

카메라가 YV12 및 인코더 COLOR_FormatYUV420SemiPlanar를 사용 중입니다.

스냅 샷은 내가 가진 유물 같은 종류의, 당신은 또한 심지어 4.3, 16의 배수가 아닌 해상도를 피해야한다

어쩌면 다른 패딩 길이, 일부 해상도 유사한 해킹을해야 할 수 있습니다 보여줍니다 분명히 (http://code.google.com/p/android/issues/detail?id=37769)!

+0

어떻게 mYSize 및 mUVSize를 결정합니까? –