package Ġcom . home soft . bitmap 2 video Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . media . Media Format Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . home soft . bitmap 2 video . FileUtils . get Video File Ċ import Ġcom . home soft . bitmap 2 video . FileUtils . share Video Ċ import Ġcom . home soft . encoder .* Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . File Ċ Ċ /* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠIs ra el ĠF lo res Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠTAG Ġ= ĠMainActivity :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġval Ġimage Array : ĠList < Int > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . raw . im 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . raw . im 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . raw . im 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . raw . im 4 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġscope : ĠCor outine Scope Ġ= ĠCor outine Scope ( Dispatch ers . Default ) ĊĠĠĠ Ġprivate Ġvar Ġvideo File : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmux er Config : ĠM ux er Config ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠmimeType Ġ= ĠMedia Format . MIME TYPE _ VIDEO _ AV C ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġav c . isEnabled Ġ= Ġis Codec Supported ( mime Type ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Self Permission ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ), Ġ 1 2 3 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Listeners () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġbt _ make . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbt _ make . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbasic Video Creation () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġav c . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġset Codec ( Media Format . MIME TYPE _ VIDEO _ AV C ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġhe vc . setOn Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġset Codec ( Media Format . MIME TYPE _ VIDEO _ HE VC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbt _ play . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo File ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set Video Path ( this . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbt _ share . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Sharing Ġvideo ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmux er Config ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshare Video ( this @ MainActivity , Ġfile , ĠmimeType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Codec ( codec : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Codec Supported ( codec )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType Ġ= Ġcodec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmux er Config ?. mime Type Ġ= ĠmimeType ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ MainActivity , Ġ" AV C ĠCodec Ġnot Ġsupported ", ĠToast . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠBasic Ġimplementation ĊĠĠĠ Ġprivate Ġfun Ġbasic Video Creation () Ġ{ ĊĠĠĠĠĠĠĠ Ġvideo File Ġ= Ġget Video File ( this @ MainActivity , Ġ" test . mp 4 ") ĊĠĠĠĠĠĠĠ Ġvideo File ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmux er Config Ġ= ĠM ux er Config ( this , Ġ 6 0 0 , Ġ 6 0 0 , ĠmimeType , Ġ 3 , Ġ 1 F , Ġ 1 5 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmux er Ġ= ĠM ux er ( this @ MainActivity , Ġmux er Config !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Video ( mux er ) Ġ// Ġusing Ġcallbacks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Video Async ( mux er ) Ġ// Ġusing Ġco - rout ines ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCallback - style Ġapproach ĊĠĠĠ Ġprivate Ġfun Ġcreate Video ( mux er : ĠM ux er ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmux er . setOn Mux ing Completed Listener ( object Ġ: ĠM ux ing Completion Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Video Successful ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Video Ġmux ed Ġ- Ġfile Ġpath : Ġ${ file . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Mux er Completed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Video Error ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" There Ġwas Ġan Ġerror Ġmux ing Ġthe Ġvideo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Mux er Completed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNeeds Ġto Ġhappen Ġon Ġa Ġbackground Ġthread Ġ( long - running Ġprocess ) ĊĠĠĠĠĠĠĠ ĠThread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmux er . mux ( image Array , ĠR . raw . ben sound _ happy rock ) ĊĠĠĠĠĠĠĠ Ġ}). start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCor outine Ġapproach ĊĠĠĠ Ġprivate Ġfun Ġcreate Video Async ( mux er : ĠM ux er ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġmux er . mux Async ( image Array , ĠR . raw . ben sound _ happy rock )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM ux ing Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Video Ġmux ed Ġ- Ġfile Ġpath : Ġ${ result . file . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Mux er Completed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠM ux ing Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" There Ġwas Ġan Ġerror Ġmux ing Ġthe Ġvideo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbt _ make . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Mux er Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbt _ make . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbt _ play . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbt _ share . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ