From f7b39c42a3676b0c355b5d4cf3d99a1fa600599c Mon Sep 17 00:00:00 2001
From: xufuji456 <839789740@qq.com>
Date: Fri, 28 May 2021 08:50:34 +0800
Subject: [PATCH] add audio player component
---
app/src/main/AndroidManifest.xml | 4 +-
.../ffmpeg/activity/AudioHandleActivity.kt | 7 +-
.../ffmpeg/activity/AudioPlayActivity.kt | 119 ++++++++++++++++++
app/src/main/res/drawable-xhdpi/ic_pause.png | Bin 0 -> 8775 bytes
app/src/main/res/drawable-xhdpi/ic_play.png | Bin 0 -> 9457 bytes
.../main/res/layout/activity_audio_play.xml | 73 +++++++++++
6 files changed, 201 insertions(+), 2 deletions(-)
create mode 100644 app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt
create mode 100644 app/src/main/res/drawable-xhdpi/ic_pause.png
create mode 100644 app/src/main/res/drawable-xhdpi/ic_play.png
create mode 100644 app/src/main/res/layout/activity_audio_play.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index eefed6c..a9278df 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -51,8 +51,10 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt b/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt
index 51c88da..94d5cac 100644
--- a/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt
+++ b/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt
@@ -1,6 +1,8 @@
package com.frank.ffmpeg.activity
import android.annotation.SuppressLint
+import android.content.Intent
+import android.net.Uri
import android.os.Environment
import android.os.Handler
import android.os.Message
@@ -177,7 +179,10 @@ class AudioHandleActivity : BaseActivity() {
}
R.id.btn_play_audio//use AudioTrack to play audio
-> {
- Thread { AudioPlayer().play(srcFile) }.start()
+// Thread { AudioPlayer().play(srcFile) }.start()
+ val audioIntent = Intent(this@AudioHandleActivity, AudioPlayActivity::class.java)
+ audioIntent.data = Uri.parse(srcFile)
+ startActivity(audioIntent)
return
}
R.id.btn_play_opensl//use OpenSL ES to play audio
diff --git a/app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt b/app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt
new file mode 100644
index 0000000..199bc0b
--- /dev/null
+++ b/app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt
@@ -0,0 +1,119 @@
+package com.frank.ffmpeg.activity
+
+import android.annotation.SuppressLint
+import android.media.MediaPlayer
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.os.Handler
+import android.os.Message
+import android.text.TextUtils
+import android.util.Log
+import android.widget.ImageView
+import android.widget.SeekBar
+import android.widget.TextView
+import com.frank.ffmpeg.R
+import com.frank.ffmpeg.util.TimeUtil
+
+class AudioPlayActivity : AppCompatActivity() {
+
+ companion object {
+ private val TAG = AudioPlayActivity::class.java.simpleName
+
+ private const val MSG_TIME = 123
+ private const val MSG_DURATION = 234
+ }
+
+ private var txtTitle: TextView? = null
+ private var txtArtist: TextView? = null
+ private var txtTime: TextView? = null
+ private var txtDuration: TextView? = null
+ private var audioBar: SeekBar? = null
+
+ private lateinit var audioPlayer:MediaPlayer
+
+ private val mHandler: Handler = @SuppressLint("HandlerLeak")
+ object : Handler() {
+ override fun handleMessage(msg: Message?) {
+ super.handleMessage(msg)
+ when (msg?.what) {
+ MSG_TIME -> {
+ audioBar?.progress = audioPlayer.currentPosition
+ txtTime?.text = TimeUtil.getVideoTime(audioPlayer.currentPosition.toLong())
+ sendEmptyMessageDelayed(MSG_TIME, 1000)
+ }
+ MSG_DURATION -> {
+ val duration = msg.obj as Int
+ txtDuration?.text = TimeUtil.getVideoTime(duration.toLong())
+ audioBar?.max = duration
+ }
+ }
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_audio_play)
+
+ initView()
+ initAudioPlayer()
+ }
+
+ private fun initView() {
+ txtTitle = findViewById(R.id.txt_title)
+ txtArtist = findViewById(R.id.txt_artist)
+ txtTime = findViewById(R.id.txt_time)
+ txtDuration = findViewById(R.id.txt_duration)
+ val btnPlay: ImageView = findViewById(R.id.img_play)
+ btnPlay.setOnClickListener {
+ if (isPlaying()) {
+ audioPlayer.pause()
+ btnPlay.setImageResource(R.drawable.ic_play)
+ } else {
+ audioPlayer.start()
+ btnPlay.setImageResource(R.drawable.ic_pause)
+ }
+ }
+ audioBar = findViewById(R.id.audio_bar)
+ audioBar?.setOnSeekBarChangeListener(object :SeekBar.OnSeekBarChangeListener {
+ override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
+ if (!fromUser) return
+ audioBar?.progress = progress
+ }
+
+ override fun onStartTrackingTouch(seekBar: SeekBar?) {
+
+ }
+
+ override fun onStopTrackingTouch(seekBar: SeekBar?) {
+ audioPlayer.seekTo(audioBar?.progress!!)
+ }
+ })
+ }
+
+ private fun initAudioPlayer() {
+ val path = intent.data?.path
+ Log.e(TAG, "path=$path")
+ if (TextUtils.isEmpty(path)) return
+ audioPlayer = MediaPlayer()
+ audioPlayer.setDataSource(path)
+ audioPlayer.prepareAsync()
+ audioPlayer.setOnPreparedListener {
+ Log.e(TAG, "onPrepared...")
+ audioPlayer.start()
+ val duration = audioPlayer.duration
+ mHandler.obtainMessage(MSG_TIME).sendToTarget()
+ mHandler.obtainMessage(MSG_DURATION, duration).sendToTarget()
+ }
+ }
+
+ private fun isPlaying() :Boolean {
+ return audioPlayer.isPlaying
+ }
+
+ override fun onStop() {
+ super.onStop()
+ audioPlayer.stop()
+ audioPlayer.release()
+ }
+
+}
diff --git a/app/src/main/res/drawable-xhdpi/ic_pause.png b/app/src/main/res/drawable-xhdpi/ic_pause.png
new file mode 100644
index 0000000000000000000000000000000000000000..dedce6a93da183cead95971ca224761e2bbc083c
GIT binary patch
literal 8775
zcmcI~=RaKE7w%v%lMsXGZS;sJF?t`pmoR#7A$sqO5=I}rmoI|ogy=PTm#9IsAfiVI
z(eC7T|AG7FzBuRX7wbHqz4m9VXRj8crJ+dpi24x#03cLWl6!^uj{JK-c$jyML2Us5
z00k(^!FB!2j)K8iw6@Kcft7(#U>iPDXObCwQ1<>$2&68YW`k7)(%CrT1J{P|qt(1Y
zjklm!%FgF;jg+qhsC4xxP>t=#Lnz8gKh*HcJgFeDQc)E7!3=?b;uDZiRI4Zu`w0jXjvAMRLP1Qm
zSYgt^Ae5L=a4WdRJsb%g5ms)Zva%thzUP_tte@u_lgmJ88H=>MzGe0B514o|2>
z)%R1c+EW{dH@xvx{S2-a1;~_S2KVCw4Zv~+8?TQN=nh6JJWPr!fdf3d(oDL2jy3A$
zX(P2NsIcJZ97a#A9}kNQrp&G3%?dDD4t>G(Pa5cL_hzbmacdb)yduamJ6tf3bn}t#bPt
z!qexOAa7}z&)STQAdSb0J&)63;x8w_2T&HS%twx)-doz#-vAI%eEg||Bl$DVT&816
zAO~nG1=to^^w{=b94JXI#}Egf3X1NHR|I(>8cKpBy1UQctm7FkVa_olWn9fPVDkgX
z85k(~R9aEh3@4tEZPlLGR6w|HPZHv;n)qe72nZL%;%WA~=2w0`Z8@V4Uh2cIRWBdg
zporP0jw97i-}UX8^TGjfSim6wQ&l|4=ZI=gY2nh@)I;>I!(}J$6r$C!$dmMd^d5gb
zC+$9Wb#!fae>ZsiFFEQkrbSp#5qZt6TFj6UkbX1FDZHHmeLpxv!2({#s#km(QzzMt
z%rNft;O$XEPY^NyszON{+7iD`G#@#AJ#&&!^T1CUnP7?Fz%}6ebl;MmBK?K(2i}Z&
zq=WVV(XJv_*}3X@x-s(^1vC40EEHh{DI_Y+w)~Ey!Ugyuuc+c2L?SZk#%vECD89aQ
z7)7SoRCTCOKV|@KZq)B;5{MJ3{w)*f*-QG5@R?oIFfROaT>Me;z%+ms!g5bQKyuzi
za0?zCINDt;$c$(*ud7iuVoU{`5cOjXbn>9s791Vp0w#p&K8WttN%#+k;=U1z8Zs(?
zHoD}g_Yy_)7hvTAdjP5}xori};f*w9`MQN?4p#T#Smszi?!vCD2(Y|dUS?jqLocn~
zl-hz*%$yFvF?HDXQRatKCcx5n1Ff}LS1o_YIPvgP0yUQ$eXO^aMEhu`Qq0~`@`TL-?Zpy>{;ay
zJwo17mBFnCGXbd^`}kUS^Z%Og;29n=W)6AyGs|-5pE8jRv3;56ZYxQ~NBT3I^eeYs
z*B_mk(_yR@1$Q5ptG<Zvr2q0-lR8NpKU@)M(
z|H{*4+CoCmNPXCBXg#9{2GV;Xw=xHlv
zkMj&iiod1O1gh8MLe({OZ=0HGyD!dEaj`k>iv8KWET^rD{!aJ@KNtM7(LFoVNQ(kB
z@h4u3uf^!dOfU0ZSm&pa(_sO+m8d9b5$1*WFrxe6^+L&tef}=<$miEzcZ61488>>~
z;3t{ms+LoDX4AY`q}!vONL#?)<*h!C`4KEo(if!T{?3D+{8gLX8s2k$3V0J4sV%`b
zJRz)2^|2$I0)4U6a4#5aWXj_J%hupA}?#uq_{qtQsi1`PeTVqY?}o*p&ie8XoIg
ztc#TSX<(mILxO86o?jlAyGO=L8^JVew;qG$%p$7D)c98pCzr?!tO5sepqH+IA)
zo%ZOSc9&JyCH>*%VZo7?Hh%ds;j=pQZ?$j7Ej2qyVf?sW*yMI1D_nts_KAcBG;lAk
zJc252GS8!t-IDPsJ@#Xf>;j`JGUUVMab#xt3i~11a7^GW$YYd~^m`&>hs&2xKinlN
z$(FS7`y_pTMhZ!6hsi4ukooz~(U1;XwvX4kt7a7ganQR}HvLDwB&QBMyHo*)g5}`LOt8YK0+P{ET
zo+tJff|pjlK&bY}JjY}-8)cqlfJ!fJU9m*_b=)TYJoQ|@6CaIYnbQiN^IE~>dO5G=
zsw52hpv_pHM!KK=Rw}@>XRx;4!^5u>6dK3hoa
z;qJRy{2rs#v7BX8%`71!s+vk4vMHx;f^24v`A%Q8rxE%sq8j4B2mBm7gk`b1$>Fps
zKWK9KRI?H5k-P?)yQ@AL7_vIfx%TKRIihQs28Xtemkb89nG`Mry>5GJn@RedxxsPH
z8_2|t!G3`DySN|?dZ$$?w|2O-KLC0tPfJsWe4h9eIJTa)EH%CdZ0|C=+~vkl&m
z4!;Oo)P8BkW|8LOvgNSyrm>I}c(5G_yeDVYA$y(kZ$O=o(6?w4LS?A~9FV
zs!A`T3l0UR*Ba!_-8qLuXd=*K?RKcQP7QJGv4o1m7>iMe9nCDvrOunGbxk*YI$FZQ
zQfe3U;(Mw1yut3rwXbGp##ob}4t$#*z+{1KJSN(mG;+J@@<)7wxMNb*1(L*OK#-qV
z)IgB;%S;Kz3A7BW(%x2>Q?5-L1&Zy(i_7PGZ$-2$JK7*Sks3$p&juwTHU;dPZz9XdN
zPTuJ*&fSl*OhZ13hPIz6wmi|AxOIeON|Z@1MK1WsKx?SRrAOK)Y#%Ht4K)Sk-}G_2
zg)ec!RK#s|GDpKzn87v_P~
z6QghN+qK?TvuNd#GLhTEl_yQ;S>A+^$}PmR$JBSIqRS}|J1J0nCZ}dW>_!(8O{D7P
zlaT5PJ1Jrok}#4|9dpSNLbBnz?aS|-6QpH=?N9?W^pWux6@-e3=%MIhB{m2n15
zxts8pxRF?@DYf)@i|2A^$t`=%8k);hpGsAyb8Wz`K!o-8Ea79Y@k#=`1
ztaY!ZNx$MO9ZB-EhhC7CW@&|0I_(L4Z&4c)tZg}Gv?IJLjr3P8ZpW)}#g8oG@zTdR
zi9FJWL+{9Ps6fP~_^XsybxEgoulGue7A|oW&`mB&TrC;x(!L07gt#x=8#U@Te~gZ(
zrdp?!VJJkogT#Zlv~|xN4SsXn7o&R-$k8FH`K|1~5Yln_d!PU|Glmv2A+si#VoIfC
z9N~bGI6_0%6jT3oqBZ;9l)?P{|OIdUOKJ?x_3%LK;JcX2!yWND+mkdM3+el@DmtGe;NlLtT
z3p>$Q4mt=E$2$L*mymEZ6B{)LO{=#bWX<$+KP0v&@L&yVD?nJKo_x%{6C5rVajwAA
zXh*9Sxk6iLK$(;!V$0K$jEjM^tH!nL&+1!h_VHXcy~U%^4~C=dVcWL!{YZz(*uV#>
z%$Z=)0UZJH-Q2jg!_C=#%6uU>`bT}p9(VEH(R^2GzIc)WDcg@&g#
zkHX~&^PB8$X@SECDm}m=Mr@?LAq$!JST2wpu~Rqui84VEvp=_xMLN0hLS;D$QOP#I
zUT)=9Yx^pf$2w5i@wx-fzcQ-rZnZa1M4r?}SV6pp3ollbXkNMsXX=2(KIHeo*`y
z!wm?htV7m!$wD||D;sMHq1&~bAd=uH(HrxnwwhNVQ?|!9Y1ulG-`PbUfU|@?Pf{58
zJ(mqb!s9z?p-R?#X+9m7y{;L5|3&MU`~G>YJnD|1c(y$pnlOqy
z{8gFR_o*yrZA{av8)Wr|&M7tOn-}8W
zg!gZlP^(h)%!ukt+Rd1vXj$ve=dN}C0Huw_rSO=BkD7Nb6aUoYe26#~#EL!*CT8gx
zSi&VQaBqufI(+^uVVfN2KnXtv&c4p?G}f~!|9tDR$8c5;;!~!%GDxW&ro{nrbG#qh
zPYC0s#^BCwbhc4wu8pI7V1cmOV1*&-usSg%70w_9rtZZZt_7kAlgqpzY03os{~bON
z{CAL4SYGblm5Iw%947U+hg$v3hrxf)!ZNSn*3kH&DyR~_a8D-m*cSPmxmV6
zbg-VlStCC71ebY}<(J12?{<2aiG!#8Q;zF^Xr6GdeViLs3z2W#l&v$m=^uXDy1{Q*w~E<
zutu{V%=Olfd-zx-8!B5?&eR?4fyprKi8~C>cnP?Axbj8!%&T(E|
zpmuDz$g@s3b{iABYH4s>-7tdTpBl+kF#&=ma$Ci{XWlD_80gcn$Fd+o^!%z;su@Z7
zwi>GR^jXhhbf$~lpaQpEldO+%Dp8Zm=xhQ9DbN7||9uMxYp3h1Et#h2&BBE$gN`VB~@~$Bgc=n7$5kpj5E4``X5k
zh0@#A|J=Zb?ag)ek=%5<__uXa3~^NjuQ3rJp+jVH!n32q#-GD>ZwsW_alcgmbFOKV
z$~w2KfkT6XY^+J$^lJ>VI)sM;pRybizrG8>PWVtuK``(t)dKdzfldz)`~^cO#*CK7
zLY{`hJOzFI6g2`EvpS;>7Ww{7yQp8-g13BipIvkvxNjnkc22FfO-wTAy~8-nkYd;%N<|
z@jATOfd+Aybyv2I=&izTA+)4LZ11=Vu+YN#G4N)ZapD!*29oN4BF$DXo}L5iG=Up^AP68kx+}WCYNfD9RB4nz30wr5$q?w
z!`F+p%XmN}rV5>haBPS{-){>Lw)ADAVByR1ES(T~y1ZFG5?~D8>lIa%@j@nI)7@W9
z9$oM4dY;PZh7q$IS5%n`80;PB@UBod%=1t?WXAF<5wDnR$|{l4@AFa}kBZtW-ID
zg&MdrSG0ra<%rl;E^g$=Yd~0v)t1+Q3mNMG%aqjNMiyKB$piNw!b5?rUeJ~|eSgt(
z?wehoIxNA6JPZ*SsyMzafd_TPwe;>Xd@S4m@re?(y#*z9NmGKp-+A$KobAd(252-w
z-q}bzh+)%x7k}vGQA3C<)YT>Y?IV$!W{@p1ZwI#23O9Iqa9+H43IzZ3pk2{;{m?i%
z+V~rfm?d-gN_HY|%iu{%hCL3el6O)-_&Rp-w%{=I>-hrTNWJYpuAK^Qzsw0l0Kn5N00ZXD_78BVC0TMS2ViOH5JQZgok(`87)sthY?u-a
zH{>)?8h9=GO@dNS#KE~E;Fw@Iar`3k=_B}|G{#5*vFU#B)u-?NO>_`;#ve92xFAsb
z!7qhPqq1^Oirk)(#&f|$QD-;CUG|X*=-*b>no3u3#ujji!j5a=y<8$J!|~8URQD0N
zKV|B9f}|`n>Ihmx^9QiB=#RWLdikH4xKLZbG)8o`4K>~o*b&N55?R`m
zD$?@0{#zKRYXJ`J8d;(Tf0yWN`|GHUxFqoW{vRpJ+G|?C5S>eeh0D>Fhs!p_-a`Vi
znnsA!t%8OP{xr(-oLCfI=}SE6mjdb#!~Fy>PWgS-=P#kzipw?C!j0`vb1DMqaEZ3q
zaK+qJW;*bqr-bmozwn7uGs!YE$q|FjUFwi+a=|TBFM`KwM3#BF_4jRs0zCr$TM1-E
z^sHv*1aH=_@&`VVV<$$E80Sw-=;9BbnUo#9ye=L
zWak9_+ha9}pOjo$S7J(sI2uz@QyXdp0{;Zl#xKShvzKp2?sF$tN6@G>0jX-N4{Wz3vf7+j
zNdjYAjQUu`5;JU0c-*uYB|Yke0*x6ErvJ9yyHsW+@o&F7;j%Lve@H-yH$Su2WnPMc
z3`9+jv)v}}!cMt#5L18fI?!+MfHrG0;2#$xj?CtFLh;ZN*XCcL(BkQiFq=@@*E5@}
z0-kZX)xr#+n7W5nOp$*~8dXb<$e{Of42AK<2!952o^^8J3)Ja^ywmgwpmhAYaxK&+
zm27W24!QQ54A{|Kd(b?*L7}d36ty}hkU*X6h_=MnDV0p
z2y|tWef$1amli^K6lLO%U8KQt#`|T|j{Cz>oKqHG15}CYoY**nN;8`-z3c2E|48P|
z7D@!$hd3$m*C{FV*W7;V?0KU4W;`Lh{deYf;DQwP3<1xz-G(JgDbAn}36H&ihMm_r
z={mSL+pO4P!{NF0$riS4I>mLpt(7b!u&DX|GoaH6<#(xd60iRWPi3i&F6=jnHHEGl
z5opDK)@~y`neP&%GdO8LJb*VFqNkp6QDK}qzU+YX>iU_`$y
zAyiyLo+>B`=5jVP#gA^g?iq~2`xGBUj
z-Aj)GeT>4P^DNvp90JX5Pq6m>Dpkw(s;5VKZMIep52`hq30H_-vwbb6f3+m)!v%xn
zJ6_sx1Be$L*);-cWYGypCVziD0QC#M++^y@`{`9qe{!>i;r$T>gMY$XxhL6nTbV4_+3q7
zspS0Ypqv+y;G$1=TR1}y(r(w<5tGQbx{1pdM`C#kEF*XZhcRU=h*~dKmY;-*cH;dT
zoGJ(Gt20hDRY&(nqkO>$s9k_oXTlQVr{*(j4fimsmNzb=CGWtEFRe>1kTt3jWRsUE
zyR+t#ieSHbD`lc5Pg)*WT_PJ=cu5uPlqYVG^+Y%fwZ1MNMOZGUq}W8?VRFXh$0n06
zVB8=p_GeuqSp&+qXru`x_`?Y|Gz1ih&&YajId$YOLLgj%p;SNzJZIPsq3CFA%q1BAet0U5mbr8{qD?@r;;BprBO?GEZ
zo&n&L1F9CwFEFpjPtP
zb^BWOXDjQ7nEvu~;Yr$}au-mPFw&X1BZV(@717nt6Vf^Cnz;tup~Eyx*ehmMeY*z(MzIu#?k
zf4-~tIWN8GO6EJ|3#+RE=o3~h?@Wqk@LEv--DSKPRZVps-6#*RFB!|p=7XY>*BYD>
zyUV(lQ?7pYwZ*O#bg*W;jl}v7ic-`)vZb2SzNXFk!)Vb1koxE!-&;q?W6c&Qw0oC_
zK7Pt-+_i~mc@viZQ9=kgv)Y@p70CC#=nXldPO_H0E-A+nmyX0&tOoyy4d%JnQGk?6
zu6`>K*neGDN_r3_1%BViY2k`rMg^S0ySxaQ5WYs(jp5|6E8zk(JyYn3eNh%9n8cMJ
z(b{jE`tJh|Rf=C3m`ptD1p`g#Y`y_n|
zmG_+dIBUf9i>Jl>`
O0#KIMkgJuk2>(AAVSp9@
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-xhdpi/ic_play.png b/app/src/main/res/drawable-xhdpi/ic_play.png
new file mode 100644
index 0000000000000000000000000000000000000000..72dc5a491146716058e0167b443e4f648eaa34c4
GIT binary patch
literal 9457
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file