본문 바로가기

안드로이드

Extractor > Decoder > Surface

assets.openFd(MEDIA_FILE).use {
MediaExtractor().apply { setDataSource(it) }
}

//0. 파일을 열어서 Extractor 에게 FileDescription을 셋팅해준다.
val extractor =  assets.openFd(MEDIA_FILE).use {
MediaExtractor().apply { setDataSource(it) }                                            
}

/* (tip)
 * setDataSource(String path); 
 * setDataSource(MediaSource mediaSource, mime);      // getTrack
 * setDataSource(FileDescriptor fd);
*/


//1. Extractor 에서 비디오, 오디오 트랙의 위치를 받아온다.
audioTrackIndex = extractor.findFirstTrackFor("video/")
videoTrackIndex = extractor.findFirstTrackFor("audio/")

fun MediaExtractor.findFirstTrackFor(type: String): Int? {
    for (i in 0 until trackCount) {
        val mediaFormat = getTrackFormat(i)
        if (mediaFormat.getString(MediaFormat.KEY_MIME)!!.startsWith(type)) {
            return i
        }
    }

    return null
}


//2. 미디어 포맷을 받아온다.(비디오가 가지고 있는 Meta 정보로는 비디오의 bitrate, width, size 등등을)
MediaFormat format = extractor.getTrackFormat(videoTrackIndex); 


//3. 미디어 포맷에서 미디어 코덱에 셋팅할 Key_mime을 받아온다. ( 비디오 압축방식 )
String mime = format.getString(MediaFormat.KEY_MIME);


//4. 이를 이용해서 미디어코덱(디코더)를 만든다.
decoder = MediaCodec.createDecoderByType(mime);


//5. 디코딩이후 output 결과를 넣어줄 Surface를 셋팅한다. // 자동으로 화면에 뿌려주게 된다.
outputsurface = Surface(surface);
decoder.configure(format, outputSurface, null, 0);
decoder.start();