跳到主要内容

AudioRecorder

从麦克风录音到指定的文件路径。适用于 macOS、Linux、Windows、iOS、Android 和 Web。 基于 record Dart/Flutter 包。

备注

在 Linux 上,编码由 fmedia 提供,必须单独安装。

AudioRecorder 控件是非可视的,应该添加到 page.overlay 列表中。

打包

要构建使用 AudioRecorder 控件的 Flet 应用程序,请在 flet build 命令中添加 --include-packages flet_audio_recorder,例如:

flet build apk --include-packages flet_audio_recorder

示例

基本示例

import flet as ft

async def main(page: ft.Page):
page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
page.appbar = ft.AppBar(title=ft.Text("音频录制器"), center_title=True)

path = "test-audio-file.wav"

async def handle_start_recording(e):
print(f"开始录音: {path}")
await audio_rec.start_recording_async(path)

async def handle_stop_recording(e):
output_path = await audio_rec.stop_recording_async()
print(f"停止录音: {output_path}")
if page.web and output_path is not None:
await page.launch_url_async(output_path)

async def handle_list_devices(e):
devices = await audio_rec.get_input_devices_async()
print(devices)

async def handle_has_permission(e):
try:
print(f"有权限: {await audio_rec.has_permission_async()}")
except Exception as e:
print(e)

async def handle_pause(e):
print(f"正在录音: {await audio_rec.is_recording_async()}")
if await audio_rec.is_recording_async():
await audio_rec.pause_recording_async()

async def handle_resume(e):
print(f"已暂停: {await audio_rec.is_paused_async()}")
if await audio_rec.is_paused_async():
await audio_rec.resume_recording_async()

async def handle_audio_encoding_test(e):
for i in list(ft.AudioEncoder):
print(f"{i}: {await audio_rec.is_supported_encoder_async(i)}")

async def handle_state_change(e):
print(f"状态更改: {e.data}")

audio_rec = ft.AudioRecorder(
audio_encoder=ft.AudioEncoder.WAV,
on_state_changed=handle_state_change,
)
page.overlay.append(audio_rec)
await page.update_async()

await page.add_async(
ft.ElevatedButton("开始录音", on_click=handle_start_recording),
ft.ElevatedButton("停止录音", on_click=handle_stop_recording),
ft.ElevatedButton("列出设备", on_click=handle_list_devices),
ft.ElevatedButton("暂停录音", on_click=handle_pause),
ft.ElevatedButton("继续录音", on_click=handle_resume),
ft.ElevatedButton("测试音频编码", on_click=handle_audio_encoding_test),
ft.ElevatedButton("检查权限", on_click=handle_has_permission),
)


ft.app(target=main)

属性

备注

并非所有属性都在所有平台上受支持。请检查这个 平台功能对比矩阵 了解各平台支持的属性。

audio_encoding

用于录音的音频编码器。支持以下值:

  • AudioEncoder.AACLC - MPEG-4 AAC 低复杂度。输出为 MPEG_4 格式容器。推荐文件扩展名:m4a
  • AudioEncoder.AACELD - MPEG-4 AAC 增强低延迟。输出为 MPEG_4 格式容器。推荐文件扩展名:m4a
  • AudioEncoder.AACHE - MPEG-4 高效 AAC(如果可用,则为版本 2)。输出为 MPEG_4 格式容器。推荐文件扩展名:m4a
  • AudioEncoder.AMRNB - AMR(自适应多速率)窄带语音。使用时,sample_rate 应设置为 8kHz。在 Android 上输出为 3GP 格式容器。推荐文件扩展名:3gp
  • AudioEncoder.AMRWB - AMR(自适应多速率)宽带语音。使用时,sample_rate 应设置为 16kHz。在 Android 上输出为 3GP 格式容器。推荐文件扩展名:3gp
  • AudioEncoder.OPUS - 输出为 MPEG_4 格式容器。适用于 Android SDK 29 和 iOS SDK 11。推荐文件扩展名:opus
  • AudioEncoder.FLAC - 自由无损音频编码。推荐文件扩展名:flac
  • AudioEncoder.WAV(默认)- 波形音频(带头文件的 pcm16bit)。推荐文件扩展名:wav
  • AudioEncoder.PCM16BITS - 线性 PCM 每样本 16 位。推荐文件扩展名:pcm

请参见 这里 了解支持哪些编码的详细概述。

auto_gain

录音机会尝试在一定范围内自动调整录音音量。默认为 False

bit_rate

音频编码比特率,以比特每秒为单位。默认为 128000

cancel_echo

录音机会尝试减少回声。默认为 False

channels_num

录音的通道数。1 = 单声道,2 = 立体声。默认为 2

sample_rate

音频的采样率,以每秒样本数为单位。默认为 44100

suppress_noise

录音机会尝试消除输入噪音。默认为 False

方法

get_input_devices()

返回一个字典,其值是平台上可用的输入设备。

has_permission()

检查(并可选择请求)音频录制权限。

is_paused()

检查录音会话是否已暂停。

is_recording()

检查是否有有效的录音会话。请注意,如果录音会话已暂停,此方法仍将返回 True

is_supported_encoder(encoder)

检查当前平台是否支持给定的 encoder

pause()

暂停录音会话。

resume()

在暂停后继续录音会话。

seek(position_milliseconds)

将光标移动到所需位置。

start_recording(output_path)

在指定的 output_path 上开始新的录音会话。在 web 平台之外,必须提供 output_path

stop_recording()

停止录音会话并释放内部录音机资源。它返回一个字符串,即录音文件的位置。在 web 平台上,它返回可以使用 page.launch_url() 打开的 blob。在其他平台上,它返回文件路径,即传递给 start_recording() 方法的 output_path 参数。

事件

on_state_changed

当音频录音机的状态改变时触发。事件的 e.data 包含以下状态之一:

  • stopped
  • recording
  • paused