package Ġcom . fr ank . ffmpeg . activity Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . media . Audio Format Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Message Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Surface View Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Compound Button Ċ import Ġandroid . widget . Toast Ċ import Ġandroid . widget . ToggleButton Ċ Ċ import Ġcom . fr ank . ffmpeg . R Ċ import Ġcom . fr ank . live . camera 2 . Camera 2 Helper Ċ import Ġcom . fr ank . live . listener . Live State ChangeListener Ċ import Ġcom . fr ank . live . param . Audio Param Ċ import Ġcom . fr ank . live . param . Video Param Ċ import Ġcom . fr ank . live . Live Push er New Ċ Ċ /** Ċ Ġ* ĠReal time Ġliving Ġwith Ġr tmp Ġstream Ċ Ġ* ĠCreated Ġby Ġfr ank Ġon Ġ 2 0 1 8 / 1 / 2 8 . Ċ Ġ*/ Ċ Ċ class ĠLive Activity Ġ: ĠBase Activity (), ĠCompound Button . On Checked ChangeListener , ĠLive State ChangeListener Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġtexture View : ĠSurface View ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlive Push er : ĠLive Push er New ? Ġ= Ġnull ĊĠĠĠ Ġ@ Suppress Lint (" Handler Leak ") ĊĠĠĠ Ġprivate Ġval Ġm Handler Ġ= Ġobject Ġ: ĠHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . handle Message ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . what Ġ== ĠMSG _ ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrMsg Ġ= Ġmsg . obj Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( err Msg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Live Activity , ĠerrMsg , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġlayout Id : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠR . layout . activity _ live ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġhide ActionBar () ĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠĠĠĠĠ Ġinit Push er () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit View sWith Click ( R . id . btn _ swap ) ĊĠĠĠĠĠĠĠ Ġ( findViewById < View >( R . id . btn _ live ) Ġas ĠToggle Button ). setOn Checked ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġ( findViewById < View >( R . id . btn _ mute ) Ġas ĠToggle Button ). setOn Checked ChangeListener ( this ) ĊĠĠĠĠĠĠĠ Ġtexture View Ġ= Ġget View ( R . id . surface _ camera ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Push er () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġ 6 4 0 // resolution ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġ 4 8 0 ĊĠĠĠĠĠĠĠ Ġval Ġvideo Bit Rate Ġ= Ġ 8 0 0 0 0 0 // kb / s ĊĠĠĠĠĠĠĠ Ġval Ġvideo Frame Rate Ġ= Ġ 1 0 // fps ĊĠĠĠĠĠĠĠ Ġval Ġvideo Param Ġ= ĠVideo Param ( width , Ġheight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . valueOf ( Camera 2 Helper . CAMERA _ ID _ BACK ), Ġvideo Bit Rate , Ġvideo Frame Rate ) ĊĠĠĠĠĠĠĠ Ġval Ġsample Rate Ġ= Ġ 4 4 1 0 0 // sample Ġrate : ĠHz ĊĠĠĠĠĠĠĠ Ġval Ġchannel Config Ġ= ĠAudio Format . CHANNEL _ IN _ STER EO ĊĠĠĠĠĠĠĠ Ġval Ġaudio Format Ġ= ĠAudio Format . ENCODING _ PCM _ 1 6 BIT ĊĠĠĠĠĠĠĠ Ġval Ġnum Channels Ġ= Ġ 2 // channel Ġnumber ĊĠĠĠĠĠĠĠ Ġval Ġaudio Param Ġ= ĠAudio Param ( sample Rate , Ġchannel Config , Ġaudio Format , Ġnum Channels ) ĊĠĠĠĠĠĠĠ Ġlive Push er Ġ= ĠLive Push er New ( this , Ġvideo Param , Ġaudio Param ) ĊĠĠĠĠĠĠĠ Ġlive Push er !!. set Preview Display ( texture View !!. holder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon CheckedChanged ( button View : ĠCompound Button , Ġis Checked : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( button View . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ live // start Ġor Ġstop Ġliving ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Push er !!. start Push ( LI VE _ URL , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Push er !!. stop Push () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ mute // mute Ġor Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" isChecked =$ isChecked ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Push er !!. set Mute ( isChecked ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" err Msg =$ msg ") ĊĠĠĠĠĠĠĠ Ġm Handler . obtain Message ( MSG _ ERROR , Ġmsg ). send To Target () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġif Ġ( live Push er Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Push er !!. release () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Click ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view . id Ġ== ĠR . id . btn _ swap ) Ġ{// switch Ġcamera ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Push er !!. switch Camera () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Selected File ( filePath : ĠString ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠLive Activity :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLI VE _ URL Ġ= Ġ" rt mp :// 1 9 2 . 1 6 8 . 1 . 3 / live / stream " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ ERROR Ġ= Ġ 1 0 0 ĊĠĠĠ Ġ} Ċ } Ċ