package Ġcom . ye unge ek . av sample . activities . media Ċ Ċ import Ġandroid . media . Media Codec Ċ import Ġandroid . media . Media Extractor Ċ import Ġandroid . media . Media Format Ċ import Ġandroid . media . Media Mux er Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Environment Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . ye unge ek . av sample . R Ċ import Ġcom . ye unge ek . av sample . databinding . Activity Media Mux er Binding Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . math . max Ċ Ċ class ĠMedia Mux er Activity Ġ: ĠAppCompatActivity (), ĠView . OnClickListener Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Media Mux er Binding ĊĠĠĠ Ġprivate Ġval Ġmux er FilePath : ĠString ĊĠĠĠ Ġprivate Ġval Ġsd card Path Ġ= Ġ"${ Environment . get External Storage Directory (). absolute Path }" ĊĊĠĠĠ Ġprivate Ġval Ġrecord Dir : ĠFile Ġ= ĊĠĠĠĠĠĠĠ ĠFile ( sd card Path Ġ+ ĠFile . separator Ġ+ Ġ" media " Ġ+ ĠFile . separator Ġ+ Ġ" record ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsd card Path Ġ+ ĠFile . separator Ġ+ Ġ" media " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠFile . separator Ġ+ Ġ" mux er " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠfilePath . mkdir s () ĊĠĠĠĠĠĠĠ Ġmux er FilePath Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ filePath " Ġ+ ĠFile . separator Ġ+ Ġ" media _ mux er _" Ġ+ ĠSystem . currentTimeMillis () Ġ+ Ġ". mp 4 " ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ##### Ġrecorder Ġfile Ġpath Ġ$ mux er FilePath ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmedia Mux er : ĠMedia Mux er Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMedia Mux er ( mux er FilePath , ĠMedia Mux er . Output Format . MUX ER _ OUTPUT _ M PEG _ 4 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Orientation Hint ( 9 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġread Buffer : ĠByteBuffer Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠByteBuffer . allocate ( 5 0 0 Ġ* Ġ 1 0 2 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Media Mux er Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . start Mux er Btn . setOnClickListener ( this ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġstart Mux er () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" ##### Ġstart Ġmux er ") ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfiles Ġ= Ġrecord Dir . list Files Ġ{ Ġfile Ġ-> Ġfile . name . endsWith (". mp 4 ") Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmedia Extractor Ġ= ĠMedia Extractor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠfilePath Ġ= Ġfiles [ 0 ]. absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" ##### Ġfile Ġpath : Ġ$ filePath ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor . set DataSource ( filePath ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfram erate Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvideo Track Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmedia Extractor . track Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġformat Ġ= Ġmedia Extractor . get Track Format ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmime Ġ= Ġformat . getString ( Media Format . KEY _ MIME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mime ?. startsWith (" video /") Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfram erate Ġ= Ġformat . getInteger ( Media Format . KEY _ FRAME _ RATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor . select Track ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Track Index Ġ= Ġmedia Mux er . add Track ( format ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Mux er . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuffer Info Ġ= ĠMedia Codec . Buffer Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Info . presentation Time Us Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsample Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( media Extractor . read Sample Data ( read Buffer , Ġ 0 ). also Ġ{ Ġsample Size Ġ= Ġit Ġ} Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Info . offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Info . size Ġ= Ġsample Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Info . flags Ġ= ĠMedia Codec . BUFFER _ FLAG _ SYNC _ FRAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer Info . presentation Time Us Ġ+= Ġ 1 0 0 0 Ġ* Ġ 1 0 0 0 Ġ/ Ġfram erate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Mux er . write Sample Data ( video Track Index , Ġread Buffer , Ġbuffer Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor . advance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Extractor . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Mux er . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Mux er . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( v ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . start _ mux er _ btn Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Mux er () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ