class MainActivity : AppCompatActivity() {
private var mediaPlayer: MediaPlayer? = null
@SuppressLint("ClickableViewAccessibility", "ResourceType")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mediaPlayer = MediaPlayer.create(this, R.raw.alarm1)
mediaPlayer?.setOnPreparedListener{
println("READY TO GO")
pushButton.setOnTouchListener { _, event ->
handleTouch(event)
private fun handleTouch(event: MotionEvent)
when (event.action) {
MotionEvent.ACTION_DOWN -> {
println("down")
mediaPlayer?.start()
MotionEvent.ACTION_UP -> {
println("up")
mediaPlayer?.pause()
mediaPlayer?.seekTo(0)
if (mediaPlayer != null && mediaPlayer?.isPlaying == true) {
mediaPlayer?.stop()
mediaPlayer?.release()
mediaPlayer = null
else -> {
println("others")
这里的逻辑还是比较直白的,有几个点需要解释一下。首先,我们需要先创建一个新的 MediaPlayer,用于播放自定义的音乐:MediaPlayer.create(this, R.raw.alarm1)
,这里,此音乐命名为 alarm1.mp3
,并存放于 res/raw/
文件夹下。mediaPlayer?.setOnPreparedListener
在这里没有任何作用,这个函数的作用是告诉我们音频何时准备好播放:Register a callback to be invoked when the media source is ready for playback.
。当我们按下按钮后,会触发 handleTouch
函数,或者更准确地说,是 handleTouch
中的 MotionEvent.ACTION_DOWN
。mediaPlayer?.start()
即播放音乐的指令。当我们松开按钮时,便会触发 handleTouch
中的 MotionEvent.ACTION_UP
。最后需要注意,MediaPlayer 是很消耗系统资源的,所以在使用完 MediaPlayer,不要等待系统自动回收,最好是主动回收资源:mediaPlayer?.stop()
,mediaPlayer?.release()
。
<LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
xmlns:tools=http://schemas.android.com/tools
android:
AndroidManifest.xml 权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />build.gradle --用了第三方管理...
HTTP、FTP、DNS传输层:为两台主机提供端到端的基础通信
TCP、UDP网络层:控制分组传输、路由选择等
IP链路层:操作系统设备驱动程序、网卡相关接口TCP 连接;可靠;有序;面向字节流;速度慢;较重量;全双工;适用于文件传输、浏览器等UDP 无连接;不可靠;无序;面向报文;速度快;轻量;适用于即时通讯、视频通话等A:你能听到吗?
B:我能听到,你能听到吗?
A:我能听到,开始吧A 和 B 两方都要能确保:我说的话,你能听到;你说的话,我能听到。所以需要三次握手A
实时音频流Android应用程序,使用户可以将音频记录和流式传输到本地服务器,并进行简单的分析。
这是一个示例应用程序,可让用户录制音频并将其实时流式传输到本地服务器。 作为回报,服务器分析音频并生成一些显示给用户的结果数据。 用户可以查看过去的会话列表,单击它们以查看结果并播放录音。
以Kotlin语言编写,使用AudioRecord API
遵循MVP体系结构的存储库模式
第三方图书馆
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 L
Kotlin FFMpeg工具
在带有Kotlin的Android上使用FFMpeg库的示例
For Video, Audio and Image/GIF operations 。
应用已预加载了音频,视频,图像,字体资源,这些资源对于尝试FFmpeg库很有用。 您也可以添加资源,但要保留扩展名并确保命名约定与该项目中使用的约定相同,以避免发生任何I / OExceptions。
每个示例将在对话框中预览结果。 文件保存在本地存储目录中,可以从那里直接访问。
FFMpeg示例(视频):
均等分割视频
VideoSplitter.with(context!!)
## 一自定义一个VitamioVideoView ##
public class VitamioVideoView extends io.vov.vitamio.widget.VideoView{
public VitamioVideoView(Cont
具体如下:
下面,我将带着上述几个问题,详细讲解自身学习Android的方法和Android学习路径;最后,还会结合前面内容,给出综合的具体执行学习Android的建议。
面向Android初、中级开发者,对于要学习的Android理论知识,我认为主要包括:
Android基础 &...
1.权限获得
1.在AndroidManifest.xml文件中,做如下声明:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Kotlin是一种基于Java虚拟机(JVM)的静态类型编程语言,而MP3Lame是一个用于音频编码的开源库。SO库文件是在Android平台上使用的共享对象库文件,用于提供特定功能的二进制代码。
Kotlin MP3Lame SO库文件是将Kotlin和MP3Lame库结合在一起使用的库文件。它可以在Kotlin语言中调用MP3Lame库提供的功能,例如对音频进行编码和解码。
相关问题:
1. Kotlin是什么?
2. MP3Lame是什么?
3. SO库文件在Android开发中有什么作用?
4. 如何在Kotlin中使用MP3Lame库?