마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ByteBuffer에 담겨있는 데이터를 MediaCodec Queue와 연결하는 방법좀 알려주세요.

+1 추천

ndk로부터 byte[] 형태로 데이터를 가져오는데요.

 

byte[] m_videoData = new byte[MAX_VIDEO_SIZE];

ByteBuffer buffer = ByteBuffer.wrap(m_videoData);

 

기존에는 buffer를 canvas에 그렸었는데 MediaCodec으로 변경하려면 queueInputBuffer()를 사용해 줘야 할텐데 어떤식으로 연결을 해줘야할지 감이 안잡혀서 질문드립니다.

 

ByteBuffer[] inputBuffers = decoder.getInputBuffers();              //decoder 가 MediaCodec
ByteBuffer[] outputBuffers = decoder.getOutputBuffers();

 

저기서 inputBuffers 와 buffer를 연결해주는게 큐와 연결해주는게 맞나요?

emerald (760 포인트) 님이 2015년 1월 5일 질문

1개의 답변

+3 추천
 
채택된 답변

canvas로 그렸던 데이터는 ffmpeg등을 통해 H264를 디코딩하여 YUV 혹은 RGB 형식의 RAW 데이터를 반환받아 그리는 방식이었을 겁니다. 

MediaCodec의 경우 ffmpeg에서 해 주던 H264를 디코딩하여 YUV 형식의 RAW 데이터로 만들어주는 역활을 합니다.

따라서 inputBuffers에 H264데이터를 넣어주면, outputBuffers 를 통해 YUV 데이터가 나옵니다.

이 데이터를 캔버스를 통해 그리면 될 겁니다. 단지  디코딩 된 데이터가 HW 메모리에 있을 경우엔 YUV 데이터를 못 구할 수도 있으니 canvas 로 그리는 것은 비추입니다.

 configure  에 입력하는 surface값을 출력할 화면으로 지정해 주시면  그 화면에 영상이 그려지니 surface를 통해 그리세요..

 

기타 자세한 사용법은 구글에서 예제로 제공해주는 http://developer.android.com/guide/topics/media/exoplayer.html 를 참조하시기 랍니다.

사악미소 (65,330 포인트) 님이 2015년 1월 5일 답변
emerald님이 2015년 1월 5일 채택됨
답변 감사합니다. 저번에도 답변달아주셨던거같은데 exoplayer라는 예제가 눈에 잘 안들어 오더라구요. 제가썻던 글을 못찾아서 다시 여쭤보지도 못했구요;

지금 막히는 부분이 byte array에 담은 h264데이터를 bytebuffer array에 담으려고 하는데(inputBuffers) 그 부분이 잘 안되네요.

ByteBuffer[] inputBuffers = decoder.getInputBuffers();
ByteBuffer[] outputBuffers = decoder.getOutputBuffers();
 
Log.d(m_strLog, "inputBuffers.length: " + inputBuffers.length + ", outputBuffers.length: " + outputBuffers.length);
 
해보면 둘다 5라는 값이 찍히는데 configue()단계에서 문제가 있었던건지 아니면 c의 realloc같은 역할을 하는 함수가 있는지 그것도 아니라면 inputBuffers에 어떻게 데이터를 밀어 넣어줘야할지 좀 알려주실수 있나요?
int index = decoder.dequeueInputBuffer(/*대기시간*/); 을 호출하면 decoder.getInputBuffers(); 에서 사용가능한 인덱스 번호가 나옵니다. 대기 시간동안 구하지 못하면 -1이 반환되구요.. 만약 0 이 반환되었다면,
inputBuffers[0] 에 데이터를 넣으시고 decoder.queueInputBuffer 를 통해 입력 해주시면 됩니다.
반대로 꺼내는 것은 dequeueInputBuffer를 통해 인덱스를 구하고 구한 인덱스에 해당하는 outputBuffers 의 값이 연산결과입니다.
...