본문 바로가기

안드로이드

안드로이드 디코딩 mediaCodec

decoding은. 파일을 stream으로 열어준다음, frame으로 바꿔주는 과정이다.
이frame 은 surface에 보여줄 수 있다.

mediaExtractor 로 mediaFormat을 뽑는다.

mediaFormat으로 mediaCodec을 만든다. mediaCodec은 mediaDecoder 만들떄 쓴다.

mediaCodec.configure( mediaFormat, surface )

mediaCodec.start()

tip)
 media codec 이 buffer를 몇개 사용할지 정함.
 ByteBuffer[] inputBuffers = codec.getInputBuffers();
 ByteBuffer[] outputBuffers = codec.getOutputBuffers();

tip)

decoder 시에는 
[파일셋팅]
 MediaExtractor extractor = new MediaExtractor();
 extractor.setDatasource(~); // 파일 경로 셋팅 

[트랙인덱스 찾기]
 int numOfTracks = extractor.getTrackCount(); 

[트랙 인덱스로 접근해서 어떤 트렉인지 확인하기]

 for( 0 ~ numOfTracks ) 
 {
   MediaFromat format = extractor.getTrackFormat(i);
   String mime = foramt.getString( MediaFormat_KEY_MIME );
   extractor.selectTrack(i); 
 }

[파일 읽기]
 int inputBufferIndex = codec.dequeInputBuffer(timeoutUs); //인풋버퍼를 pool에서 하나 가져온다.
 ByteBuffer byteBuffer_input = getInputBuffer(inputBufferIndex);
 
 byteBuffer_input 에 데이터를 채웁니다. ( stream데이터겠죠 )
 queueInputBuffer ( index ) 

[디코딩된 결과 받기]
 outputBufferIndex = codec.dequeOutputBuffer(timeoutUs);

[그리기]
 방법1. surface에 바로 그리기
   codec.releaseOutputBuffer( outputBufferIndex ,  true (surface ) );
 방법2. processing 고 렌더링하기
    ByteBuffer byteBuffer_output = getOutputBuffer(outputBufferIndex);
   processing(byteBuffer_output);
   rendering(byteBuffer_output);

 

소스코드

오브젝트코드

바이너리

 

cmake 외부라이브러리 관리

 

dll so