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
'안드로이드' 카테고리의 다른 글
Extractor > Decoder > Surface (2) | 2023.08.02 |
---|---|
Thread, Task, MessageQueue , looper, Handler, dispatcher (0) | 2023.04.21 |
Media Player에 대한 설명 (0) | 2023.04.07 |
주말공부 리스트 (0) | 2023.02.24 |
미디어코덱 - 비디오,오디오 디코딩 및 재생 (0) | 2023.02.24 |