package Ġcom . example . sample _ video Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Asset FileDescriptor Ċ import Ġandroid . content . res . Asset Manager Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Port er D uff Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . media . Media Codec Ċ import Ġandroid . media . Media Codec Info Ċ import Ġandroid . media . Media Format Ċ import Ġandroid . media . Media Mux er Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Surface Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . File Ċ import Ġjava . nio . ByteBuffer Ċ import Ġandroid . media . Media Extractor ĊĊĊĊ Ċ class ĠRec order ( Ċ Ġval Ġcontext : Context , ĊĠ ĠmimeType : ĠString Ġ= Ġ" video / av c ", ĊĠ Ġbit Rate : ĠInt Ġ= ĠDEFAULT _ BIT RATE , ĊĠ Ġi Frame Interval : ĠInt Ġ= ĠDEFAULT _ IF R AME _ INTERVAL , ĊĠ Ġprivate Ġval Ġframes PerSecond : ĠInt Ġ= ĠDEFAULT _ FPS , ĊĠ Ġwidth : ĠInt Ġ= ĠDEFAULT _ WIDTH , ĊĠ Ġheight : ĠInt Ġ= ĠDEFAULT _ HEIGHT , ĊĠ Ġvideo Output : ĠFile Ċ ) Ġ: ĠClose able Ġ{ ĊĊĠ Ġprivate Ġval Ġvideo Buffer Info : ĠMedia Codec . Buffer Info Ġ= ĠMedia Codec . Buffer Info () ĊĠ Ġprivate Ġlateinit Ġvar Ġvideo Encoder : ĠMedia Codec ĊĠ Ġprivate Ġlateinit Ġvar Ġmux er : ĠMedia Mux er ĊĠ Ġprivate Ġlateinit Ġvar Ġinput Surface : ĠSurface ĊĠ Ġprivate Ġvar Ġtrack Index : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġmux er Started : ĠBoolean Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġfake Pts : ĠLong Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġvideo Length In Ms : ĠLong Ġ= Ġ 0 ĊĊĠ Ġval Ġm Audio Extractor Ġ= ĠMedia Extractor () ĊĠ Ġvar Ġaudio Track Index Ġ= Ġ- 1 ĊĊĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠVERBOSE Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ IF R AME _ INTERVAL Ġ= Ġ 5 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ BIT RATE Ġ= Ġ 4 Ġ* Ġ 1 0 0 0 Ġ* Ġ 1 0 0 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ WIDTH Ġ= Ġ 7 2 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ HEIGHT Ġ= Ġ 7 2 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ FPS Ġ= Ġ 3 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠTIME OUT _ USE C Ġ= Ġ 1 0 0 0 0 ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġif Ġ( width Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" You Ġmust Ġset Ġa Ġpositive Ġwidth ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( height Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" You Ġmust Ġset Ġa Ġpositive Ġheight ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( frames PerSecond Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" You Ġmust Ġset Ġa Ġpositive Ġnumber Ġof Ġframes Ġper Ġsecond ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvideo Format Ġ= Ġcreate Media Format ( mime Type , Ġwidth , Ġheight , Ġbit Rate , Ġi Frame Interval ) ĊĊĠĠĠ Ġ// ĠCreate Ġa ĠMedia Codec Ġvideo Encoder , Ġand Ġconfigure Ġit Ġwith Ġour Ġformat . Ġ ĠGet Ġa ĠSurface ĊĠĠĠ Ġ// Ġwe Ġcan Ġuse Ġfor Ġinput Ġand Ġwrap Ġit Ġwith Ġa Ġclass Ġthat Ġhandles Ġthe ĠE GL Ġwork . ĊĠĠĠ Ġstart Video Encoder ( mime Type , Ġvideo Format ) ĊĊĠĠĠ Ġ// ĠCreate Ġa ĠMedia Mux er . Ġ ĠWe Ġcan 't Ġadd Ġthe Ġvideo Ġtrack Ġand Ġstart () Ġthe Ġmux er Ġhere , ĊĠĠĠ Ġ// Ġbecause Ġour ĠMedia Format Ġdoesn 't Ġhave Ġthe ĠMagic ĠGood ies . Ġ ĠThese Ġcan Ġonly Ġbe ĊĠĠĠ Ġ// Ġobtained Ġfrom Ġthe Ġvideo Encoder Ġafter Ġit Ġhas Ġstarted Ġprocessing Ġdata . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠWe 're Ġnot Ġactually Ġinterested Ġin Ġmultip lex ing Ġaudio . Ġ ĠWe Ġjust Ġwant Ġto Ġconvert ĊĠĠĠ Ġ// Ġthe Ġraw ĠH . 2 6 4 Ġelement ary Ġstream Ġwe Ġget Ġfrom ĠMedia Codec Ġinto Ġa Ġ. mp 4 Ġfile . ĊĠĠĠ Ġcreate Media Mux er ( video Output ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġå°Ĩ å½ĵåīį å¸ § ç»ĺ åĪ¶ åĪ° Media Codec ä¸ŃçļĦ Surface çļĦ canvas ä¸Ń ĊĠĠ Ġ*/ ĊĠ Ġfun Ġnext Frame ( current Frame : ĠDrawable ) Ġ{ ĊĠĠĠ Ġdrain Encoder ( false ) ĊĠĠĠ Ġval Ġcanvas Ġ= Ġinput Surface . lock Canvas ( null ) Ġ// ä»İ Surface ä¸Ń èİ·åıĸ Canvas ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġcanvas . draw Color ( Color . TRANSP ARENT , ĠPort er D uff . Mode . CLEAR ) Ġ Ġ// ĠHere Ġyou Ġneed Ġto Ġset Ġsome Ġkind Ġof Ġbackground . ĠCould Ġbe Ġany Ġcolor ĊĠĠĠĠĠ Ġcurrent Frame . draw ( canvas ) Ġ// æıĲä¾Ľ çĶ» å¸ĥ ç»Ļ drawable ç»ĺ åĪ¶ ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġinput Surface . unlock Canvas And Post ( canvas ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġend () Ġ{ ĊĠĠĠ Ġdrain Encoder ( true ) ĊĠĠĠ Ġclose () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Media Mux er ( output : ĠFile ) Ġ{ ĊĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" input Surface Ġwill Ġgo Ġto Ġ$ output ") ĊĊĠĠĠ Ġmux er Ġ= ĠMedia Mux er ( ĊĠĠĠĠĠĠĠ Ġoutput . toString (), ĊĠĠĠĠĠĠĠ ĠMedia Mux er . Output Format . MUX ER _ OUTPUT _ M PEG _ 4 ĊĠĠĠ Ġ) ĊĊĠĠĠ ĠLog . e (" ly d "," ĠMedia Mux er ĠåĪĿå§ĭåĮĸ "); ĊĊĠĠĠ Ġtrack Index Ġ= Ġ- 1 ĊĠĠĠ Ġmux er Started Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstart Video Encoder ( mime Type : ĠString , Ġvideo Format : ĠMedia Format ) Ġ{ ĊĠĠĠ Ġvideo Encoder Ġ= ĠMedia Codec . create Encoder ByType ( mime Type ) ĊĠĠĠ Ġvideo Encoder . configure ( video Format , Ġnull , Ġnull , ĠMedia Codec . CONFIGURE _ FLAG _ ENCODE ) ĊĠĠĠ Ġinput Surface Ġ= Ġvideo Encoder . create Input Surface () ĊĠĠĠ Ġvideo Encoder . start () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Media Format ( ĊĠĠĠĠĠ ĠmimeType : ĠString , ĊĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠ Ġheight : ĠInt , ĊĠĠĠĠĠ Ġbit Rate : ĠInt , ĊĠĠĠĠĠ Ġi Frame Interval : ĠInt ĊĠ Ġ): ĠMedia Format Ġ{ ĊĠĠĠ Ġval Ġvideo Format Ġ= ĠMedia Format . create Video Format ( mime Type , Ġwidth , Ġheight ) ĊĠĠĠ Ġvideo Format . set Integer ( Media Format . KEY _ COLOR _ FORMAT , ĠMedia Codec Info . Codec Capabilities . COLOR _ Format Surface ) ĊĠĠĠ Ġvideo Format . set Integer ( Media Format . KEY _ BIT _ RATE , Ġbit Rate ) ĊĠĠĠ Ġvideo Format . set Integer ( Media Format . KEY _ FRAME _ RATE , Ġframes PerSecond ) ĊĠĠĠ Ġvideo Format . set Integer ( Media Format . KEY _ I _ FRAME _ INTERVAL , Ġi Frame Interval ) ĊĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" format : Ġ$ video Format ") ĊĠĠĠ Ġreturn Ġvideo Format ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠExtract s Ġall Ġpending Ġdata Ġfrom Ġthe Ġvideo Encoder . ĊĠĠ Ġ* ĊĠĠ Ġ* ĊĠĠ Ġ* ĠIf Ġend Of Stream Ġis Ġnot Ġset , Ġthis Ġreturns Ġwhen Ġthere Ġis Ġno Ġmore Ġdata Ġto Ġdrain . Ġ ĠIf Ġit ĊĠĠ Ġ* Ġis Ġset , Ġwe Ġsend ĠEOS Ġto Ġthe Ġvideo Encoder , Ġand Ġthen Ġiterate Ġuntil Ġwe Ġsee ĠEOS Ġon Ġthe Ġinput Surface . ĊĠĠ Ġ* ĠCalling Ġthis Ġwith Ġend Of Stream Ġset Ġshould Ġbe Ġdone Ġonce , Ġright Ġbefore Ġstopping Ġthe Ġmux er . ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress Lint (" Switch Int Def ") ĊĠ Ġprivate Ġfun Ġdrain Encoder ( end Of Stream : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" drain Encoder ($ end Of Stream )") ĊĊĠĠĠ Ġif Ġ( end Of Stream ) Ġ{ ĊĠĠĠĠĠ ĠLog . d (" TAG ", Ġ" sending Ġend Ġof Ġstream Ġto Ġvideo Encoder ") ĊĠĠĠĠĠ Ġvideo Encoder . signal EndOf InputStream () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdrain Encoder Post L ol lip op ( end Of Stream ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdrain Encoder Post L ol lip op ( end Of Stream : ĠBoolean ) Ġ{ ĊĠĠĠ Ġencode Loop @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġoutput Buffer Index Ġ= Ġvideo Encoder . de queue Output Buffer ( video Buffer Info , ĠTIME OUT _ USE C . to Long ()) ĊĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput Buffer Index Ġ== ĠMedia Codec . INFO _ TRY _ AG AIN _ L ATER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġinput Surface Ġavailable Ġyet ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! end Of Stream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ encode Loop Ġ// Ġout Ġof Ġwhile ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" no Ġinput Surface Ġavailable , Ġspin ning Ġto Ġawait ĠEOS ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput Buffer Index Ġ== ĠMedia Codec . INFO _ OUTPUT _ FORMAT _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġstart Mux er () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoutput Buffer Index Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( encode Video Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Encoder . getOutput Buffer ( output Buffer Index ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Buffer Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Of Stream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġbreak @ encode Loop ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . w (" TAG ", Ġ" unexpected Ġresult Ġfrom Ġvideo Encoder . de queue Output Buffer : Ġ$ output Buffer Index ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġstart Mux er () Ġ{ ĊĠĠĠ Ġ// Ġshould Ġhappen Ġbefore Ġreceiving Ġbuffers , Ġand Ġshould Ġonly Ġhappen Ġonce ĊĠĠĠ Ġif Ġ( mux er Started ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠRuntimeException (" format Ġchanged Ġtwice ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnew Format Ġ= Ġvideo Encoder . output Format ĊĠĠĠ ĠLog . d (" TAG ", Ġ" video Encoder Ġinput Surface Ġformat Ġchanged : Ġ$ new Format ") ĊĊĠĠĠ Ġtrack Index Ġ= Ġmux er . add Track ( new Format ) ĊĠĠĠ Ġstart Audio () ĊĠĠĠ Ġmux er . start () ĊĠĠĠ Ġmux er Started Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġencode Video Data ( encoded Data : ĠByteBuffer , Ġoutput Buffer Index : ĠInt , Ġend Of Stream : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( video Buffer Info . flags Ġand ĠMedia Codec . BUFFER _ FLAG _ CODEC _ CONFIG Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThe Ġcodec Ġconfig Ġdata Ġwas Ġpulled Ġout Ġand Ġfed Ġto Ġthe Ġmux er Ġwhen Ġwe Ġgot ĊĠĠĠĠĠ Ġ// Ġthe ĠINFO _ OUTPUT _ FORMAT _ CHANGED Ġstatus . ĠIgnore Ġit . ĊĠĠĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" ign oring ĠBUFFER _ FLAG _ CODEC _ CONFIG ") ĊĠĠĠĠĠ Ġvideo Buffer Info . size Ġ= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( video Buffer Info . size Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! mux er Started ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" mux er Ġhasn 't Ġstarted ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġadjust Ġthe ĠByteBuffer Ġvalues Ġto Ġmatch ĠBuffer Info ĊĠĠĠĠĠ Ġencoded Data . position ( video Buffer Info . offset ) ĊĠĠĠĠĠ Ġencoded Data . limit ( video Buffer Info . offset Ġ+ Ġvideo Buffer Info . size ) ĊĠĠĠĠĠ Ġvideo Buffer Info . presentation Time Us Ġ= Ġfake Pts ĊĠĠĠĠĠ Ġ// Ġwe Ġsave Ġms Ġlength Ġof Ġthe Ġvideo Ġbefore Ġbuffer Ġis Ġdisposed : ĊĠĠĠĠĠ Ġif Ġ( end Of Stream ) Ġvideo Length In Ms Ġ= Ġvideo Buffer Info . presentation Time Us ĊĠĠĠĠĠ Ġfake Pts Ġ+= Ġ 1 0 0 0 0 0 0 L Ġ/ Ġframes PerSecond ĊĊĠĠĠĠĠ Ġmux er . write Sample Data ( track Index , Ġencoded Data , Ġvideo Buffer Info ) ĊĠĠĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" sent Ġ${ video Buffer Info . size } Ġbytes Ġto Ġmux er ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvideo Encoder . release Output Buffer ( output Buffer Index , Ġfalse ) ĊĊĠĠĠ Ġif Ġ( video Buffer Info . flags Ġand ĠMedia Codec . BUFFER _ FLAG _ END _ OF _ STREAM Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! end Of Stream ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w (" TAG ", Ġ" re ached Ġend Recording Ġof Ġstream Ġunexpected ly ") ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" end Recording Ġof Ġstream Ġreached ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġtrue Ġ// Ġout Ġof Ġwhile ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRelease s Ġvideo Encoder Ġresources . ĠMay Ġbe Ġcalled Ġafter Ġpartial Ġ/ Ġfailed Ġinitialization . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġif Ġ( VERBOSE ) ĠLog . d (" TAG ", Ġ" re leasing Ġvideo Encoder Ġobjects ") ĊĠĠĠ Ġvideo Encoder . stop () ĊĠĠĠ Ġvideo Encoder . release () ĊĠĠĠ Ġinput Surface . release () ĊĠĠĠ ĠLog . e (" ly d "," Ġ éĩĬæĶ¾ æĴŃæĶ¾ åĻ¨ Ġ") ĊĠĠĠ Ġmux er . stop () ĊĠĠĠ Ġmux er . release () ĊĠ Ġ} ĊĊĠ Ġ/** éŁ³ é¢ĳ Ġ---------------------------------------------------------------- - Ġ*/ ĊĠĠ Ġfun Ġstart Audio (){ ĊĠĠĠ Ġ// Ġ éŁ³ é¢ĳ çļĦ Media Extractor ĊĠĠĠ Ġ// Ġ éŁ³ é¢ĳ çļĦ Media Extractor Ċ // ĠĠĠ Ġm Audio Extractor . set DataSource (" images / aud _ 0 . mp 3 ") Ċ // ĠĠĠ Ġval Ġp Ġ= Ġcontext . assets . open Fd (" images / aud _ 1 . m 4 a ") ĊĠĠĠ Ġval Ġp Ġ= Ġcontext . assets . open Fd (" images 4 / aud _ 0 . m 4 a ") ĊĠĠĠ Ġm Audio Extractor . set DataSource ( p ) ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġm Audio Extractor . track Count ) Ġ{ ĊĠĠĠĠĠ Ġval Ġformat Ġ= Ġm Audio Extractor . get Track Format ( i ) ĊĠĠĠĠĠ Ġif Ġ( format . getString ( Media Format . KEY _ MIME ) !!. startsWith (" audio / ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Audio Extractor . select Track ( i ) ĊĠĠĠĠĠĠĠ Ġprint Init (" é©¬ ä¸Ĭ æī§è¡Į Ġ") ĊĠĠĠĠĠĠĠ Ġaudio Track Index Ġ= Ġmux er . add Track ( format ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠĠ Ġfun Ġencoder Audio (){ ĊĠĠĠ Ġ// Ġ å°ģè£ħ éŁ³ é¢ĳ track ĊĠĠĠ Ġ// Ġ å°ģè£ħ éŁ³ é¢ĳ track ĊĠĠĠ Ġif Ġ(- 1 Ġ!= Ġaudio Track Index ) Ġ{ ĊĠĠĠĠĠ Ġval Ġinfo Ġ= ĠMedia Codec . Buffer Info () ĊĠĠĠĠĠ Ġinfo . presentation Time Us Ġ= Ġ 0 ĊĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( 1 0 0 Ġ* Ġ 1 0 2 4 ) ĊĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsample Size : ĠInt Ġ= Ġm Audio Extractor . read Sample Data ( buffer , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sample Size Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinfo . offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġinfo . size Ġ= Ġsample Size ĊĠĠĠĠĠĠĠ Ġinfo . flags Ġ= ĠMedia Codec . BUFFER _ FLAG _ SYNC _ FRAME ĊĠĠĠĠĠĠĠ Ġinfo . presentation Time Us Ġ= Ġm Audio Extractor . get Sample Time () ĊĠĠĠĠĠĠĠ Ġmux er . write Sample Data ( audio Track Index , Ġbuffer , Ġinfo ) ĊĠĠĠĠĠĠĠ Ġm Audio Extractor . advance () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġprint Init ( tag : String ){ ĊĠĠĠ ĠLog . e (" ly d "," ${ tag } åĪĿå§ĭåĮĸ çĬ¶æĢģ ${ this :: mux er . isInitialized }") ĊĠ Ġ} Ċ }