App Inventor 2 音频录制与播放教程

覆盖:SoundRecorder录音、Player音乐播放器(带进度条)、Sound音效。

一、三种音频组件对比

组件适用场景特点
Sound(音效)短音效(<5秒)低延迟,适合按钮音效、游戏音效
Player(播放器)长音频、音乐支持进度控制、循环、后台播放
SoundRecorder(录音)录制音频保存为.3gp格式

二、Sound 音效组件

2.1 基本用法

// 设计器中:将音效文件添加到项目媒体资源
当 Screen1.初始化 时
  设置 音效1.音源 = "click.mp3"
  设置 音效1.最小间隔 = 300    // 防止连续触发(毫秒)

// 播放音效
当 按钮1.被点击 时
  调用 音效1.播放

// 震动(毫秒)
调用 音效1.震动(500)    // 震动500毫秒

三、Player 音乐播放器

3.1 核心属性与方法

属性/方法说明
音源(Source)音频文件名或URL
循环(Loop)是否循环播放
仅前台播放(PlayOnlyInForeground)切换屏幕是否暂停
正在播放(IsPlaying)是否正在播放(只读)
开始()播放
暂停()暂停
停止()停止并重置
音量0~100

3.2 带进度条的音乐播放器

初始化全局变量 播放中 = 假
初始化全局变量 总时长 = 0

当 Screen1.初始化 时
  设置 播放器1.音源 = "music.mp3"
  设置 计时器_进度.计时间隔 = 500    // 每500ms更新进度

// 播放/暂停切换
当 按钮_播放暂停.被点击 时
  如果 全局变量 播放中 = 假 则
    调用 播放器1.开始
    设置 全局变量 播放中 = 真
    设置 按钮_播放暂停.文本 = "⏸"
    设置 计时器_进度.启用计时 = 真
  否则
    调用 播放器1.暂停
    设置 全局变量 播放中 = 假
    设置 按钮_播放暂停.文本 = "▶"
    设置 计时器_进度.启用计时 = 假

// 停止
当 按钮_停止.被点击 时
  调用 播放器1.停止
  设置 全局变量 播放中 = 假
  设置 按钮_播放暂停.文本 = "▶"
  设置 计时器_进度.启用计时 = 假
  设置 滑动条_进度.滑块位置 = 0
  设置 标签_时间.文本 = "00:00 / 00:00"

// 定时更新进度
当 计时器_进度.计时 时
  如果 播放器1.正在播放 则
    // 注意:Player没有直接获取当前位置的方法
    // 需要用计时器累计时间
    设置 全局变量 已播放秒 = 全局变量 已播放秒 + 0.5
    
    如果 全局变量 总时长 > 0 则
      设置 滑动条_进度.滑块位置 = 全局变量 已播放秒 * 100 / 全局变量 总时长
    
    设置 标签_时间.文本 = 合并字符串(
      调用 秒转时间(四舍五入(全局变量 已播放秒)),
      " / ",
      调用 秒转时间(全局变量 总时长)
    )

// 播放完成
当 播放器1.播放完成时
  设置 全局变量 播放中 = 假
  设置 按钮_播放暂停.文本 = "▶"
  设置 计时器_进度.启用计时 = 假
  设置 全局变量 已播放秒 = 0

// 秒转时间格式
定义 秒转时间(总秒)
  初始化局部变量 分 = 商(总秒, 60)
  初始化局部变量 秒 = 余数(总秒, 60)
  返回 合并字符串(调用 补零(分, 2), ":", 调用 补零(秒, 2))

// 音量控制
当 滑动条_音量.位置改变 时(滑块位置)
  设置 播放器1.音量 = 四舍五入(滑块位置)

// 循环播放切换
当 复选框_循环.改变 时
  设置 播放器1.循环 = 复选框_循环.选中

3.3 播放网络音频

// 播放网络MP3
当 按钮_播放网络.被点击 时
  设置 播放器1.音源 = "https://example.com/music.mp3"
  调用 播放器1.开始

四、SoundRecorder 录音

4.1 基本录音

初始化全局变量 录音文件路径 = ""
初始化全局变量 录音中 = 假

// 开始录音
当 按钮_录音.被点击 时
  如果 全局变量 录音中 = 假 则
    // 设置保存路径(ASD目录)
    初始化局部变量 文件名 = 合并字符串(
      "/storage/emulated/0/Android/data/",
      Screen1.包名,
      "/files/recording_",
      调用 计时器1.格式化日期时间(调用 计时器1.现在, "yyyyMMdd_HHmmss"),
      ".3gp"
    )
    设置 录音机1.保存路径 = 文件名
    调用 录音机1.开始
    设置 全局变量 录音中 = 真
    设置 按钮_录音.文本 = "⏹ 停止录音"
    设置 标签_状态.文本 = "🔴 录音中..."
  否则
    调用 录音机1.停止
    设置 全局变量 录音中 = 假
    设置 按钮_录音.文本 = "🎙 开始录音"

// 录音完成
当 录音机1.录音完成后 时(音频文件路径)
  设置 全局变量 录音文件路径 = 音频文件路径
  设置 标签_状态.文本 = 合并字符串("✅ 录音完成:", 音频文件路径)
  设置 按钮_播放录音.启用 = 真

// 播放录音
当 按钮_播放录音.被点击 时
  如果 全局变量 录音文件路径 ≠ "" 则
    设置 播放器1.音源 = 全局变量 录音文件路径
    调用 播放器1.开始

4.2 录音上传到服务器

// 录音完成后自动上传
当 录音机1.录音完成后 时(音频文件路径)
  设置 全局变量 录音文件路径 = 音频文件路径
  
  // 读取文件为Base64
  调用 文件工具1.读取文件为Base64(音频文件路径)

当 文件工具1.读取完成 时(Base64文本)
  // 上传到服务器
  设置 Web客户端1.URL = "https://api.example.com/upload_audio"
  调用 Web客户端1.构建请求数据(
    ["audio", "filename"],
    [Base64文本, "recording.3gp"]
  )
  调用 Web客户端1.发送POST请求

五、常见问题

Q1:录音文件在哪里?

默认保存在App私有目录,通过 SavedRecording 属性指定路径可保存到ASD目录。

Q2:Player播放网络音频卡顿?

  • 检查网络连接
  • 使用CDN加速
  • 预加载:提前设置音源,等缓冲后再播放

Q3:Sound和Player有什么区别?

  • Sound:适合短音效(<5秒),低延迟,不支持进度控制
  • Player:适合长音频,支持暂停/循环/音量,有轻微启动延迟

Q4:如何实现后台播放音乐?

设置 播放器1.仅前台播放 = 假,切换Screen后音乐继续播放。

参考资料


文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。