MediaCodec 인코더를 위해 보폭과 Y 평면 정렬 값을 얻는 방법 :이 주제에 대한 몇 가지 관련 질문과 토론있다
- Mediacodec and camera, color space incorrect
- Getting QualComm encoders to work via MediaCodec API
- https://groups.google.com/d/msg/android-platform/awaNwgb6EbY/a-YiIOwaL0QJ
- https://code.google.com/p/android/issues/detail?id=37769
카메라 미리보기 프레임 (NV21
을 NV12
으로 변환) MediaCodec
인코더 (NV12
aka COLOR_FormatYUV420SemiPlanar
). 미만의 Android 버전을 실행하는 QualComm
인코더가있는 일부 기기에서는 올바른 색상으로 프레임을 다시 수신하기 위해 일부 입력 프레임 처리를해야합니다.
Android 4.2.2
을 실행하면 거의 모든 해상도에서 작동하도록 Y
평면 정렬을 추가해야합니다. 위 코드는 다른 해상도의 경우 32
및 2048
바이트로 나눌 수없는 너비에 대해 1024
바이트 정렬을 추가합니다. 16
(176x144
의 경우는 UV
평면이 정렬되지 않은 경우를 제외하고)으로 나눌 수있는 모든 해상도에 대해 프레임을 올바르게 인코딩하도록 MediaCodec
을 만듭니다.
int getYPadding() {
if (mediaCodecInfo.getName().contains("OMX.qcom") && android.os.Build.VERSION.SDK_INT < 18) {
if ((getWidth() % 32) != 0) {
return (getWidth()*getHeight()) % 1024;
} else {
return (getWidth()*getHeight()) % 2048;
}
}
return 0;
}
나는 같은 Android 4.2.2
를 실행하고 QualComm
인코더를 가지고있다 LG G2
에서이 정렬을 테스트하기 위해 노력했습니다, 그것이 제대로 작동하지 않는 것 같습니다. UV
평면이 잘못 정렬됩니다 (프레임 하단의 녹색 줄무늬). 두 휴대 전화 모두에서 사용할 패딩을 계산할 수 없었습니다.
나는 Sony Xperia Z1
Android 4.3
QualComm
칩셋으로도 실행되며 이러한 문제가없는 것처럼 보입니다. 모든 해상도의 비디오는 괜찮아 보이며 Y
평면을 정렬 할 필요가 없습니다.
하드웨어와 관련되어 있고 복잡 할 수도 있음을 알고 있지만, 4.3
이전에 Android를 실행하는 사용자를 지원해야하므로 질문이 있습니다. 인코더가 주어진 색상 형식에 대해 기대하는 평면 정렬 및 수직/수평 스트라이드 값을 프로그래밍 방식으로 결정할 수 있습니까? Y
감사합니다. @fadden 굉장합니다! :) 올바른 정렬 방법으로 마침내'Sony Xperia ZR'의 모든 해상도에서 작동하게 만들 수있었습니다. 'LG G2'는 여전히 버그가 있지만, 별도의 질문으로 마무리하고 스크린 샷을 첨부 할 것입니다. –
이것에 덧붙여, Y 평면과 UV 평면을 2K 경계에서 정렬하려고 할 가능성이 높습니다. 예 : 480x480의 RGB 비디오 해상도의 경우 MediaCodec에 전달 될 yuv420Buffer는 다음 크기로 변환되어야합니다. YUVBufferSize + yOffset + uvOffset : (480 * 480 * 1.5) + (2048 - ((480 * 480) % 2048)) + (2048 - ((480 * 480/2) % 2048)). 어떤 인코더가 LG_G2를 사용하는지 알지 못합니다. qcom- 인코더라면이 논리를 시도해보십시오. 희망이 도움이됩니다. – Gagan