跳到主要内容

音频

一个可以同时播放多个音频文件的控件。适用于 macOS、Linux、Windows、iOS、Android 和 Web。基于 audioplayers Flutter 小部件。

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

打包

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

flet build apk --include-packages flet_audio

示例

实时示例

自动播放音频

备注

自动播放在桌面、移动应用和 Safari 浏览器中有效,但在 Chrome/Edge 中无效。

import flet as ft

def main(page: ft.Page):
audio1 = ft.Audio(
src="https://luan.xyz/files/audio/ambient_c_motion.mp3", autoplay=True
)
page.overlay.append(audio1)
page.add(
ft.Text("这是一个带背景音频的应用。"),
ft.ElevatedButton("停止播放", on_click=lambda _: audio1.pause()),
)

ft.app(target=main)

带播放控件的音频

import flet as ft

url = "https://github.com/mdn/webaudio-examples/blob/main/audio-analyser/viper.mp3?raw=true"

def main(page: ft.Page):
def volume_down(_):
audio1.volume -= 0.1
audio1.update()

def volume_up(_):
audio1.volume += 0.1
audio1.update()

def balance_left(_):
audio1.balance -= 0.1
audio1.update()

def balance_right(_):
audio1.balance += 0.1
audio1.update()

audio1 = ft.Audio(
src=url,
autoplay=False,
volume=1,
balance=0,
on_loaded=lambda _: print("加载完成"),
on_duration_changed=lambda e: print("持续时间变化:", e.data),
on_position_changed=lambda e: print("位置变化:", e.data),
on_state_changed=lambda e: print("状态变化:", e.data),
on_seek_complete=lambda _: print("定位完成"),
)
page.overlay.append(audio1)
page.add(
ft.ElevatedButton("播放", on_click=lambda _: audio1.play()),
ft.ElevatedButton("暂停", on_click=lambda _: audio1.pause()),
ft.ElevatedButton("继续", on_click=lambda _: audio1.resume()),
ft.ElevatedButton("释放", on_click=lambda _: audio1.release()),
ft.ElevatedButton("定位到2秒", on_click=lambda _: audio1.seek(2000)),
ft.Row(
[
ft.ElevatedButton("降低音量", on_click=volume_down),
ft.ElevatedButton("提高音量", on_click=volume_up),
]
),
ft.Row(
[
ft.ElevatedButton("左声道", on_click=balance_left),
ft.ElevatedButton("右声道", on_click=balance_right),
]
),
ft.ElevatedButton(
"获取持续时间", on_click=lambda _: print("持续时间:", audio1.get_duration())
),
ft.ElevatedButton(
"获取当前位置",
on_click=lambda _: print("当前位置:", audio1.get_current_position()),
),
)

ft.app(target=main)

属性

autoplay

在音频控件添加到页面后立即开始播放音频。

备注

自动播放在桌面、移动应用和 Safari 浏览器中有效,但在 Chrome/Edge 中无效。

balance

设置立体声平衡。

-1 - 左声道全音量;右声道静音。1 - 右声道全音量;左声道静音。0 - 两个声道音量相同。

备注

设置平衡仅在 Windows 和 Linux 上支持。

playback_rate

设置播放速度。iOS 和 macOS 的范围在 0.5 到 2 倍之间。Android SDK 版本应为 23 或更高。

release_mode

设置释放模式。支持以下值:

  • ReleaseMode.RELEASE(默认) - 释放所有资源,就像调用 release() 方法一样。在 Android 中,媒体播放器资源占用较多,这将释放资源。在 iOS 和 macOS 中,作用类似于 stop() 方法。
  • ReleaseMode.LOOP - 保持缓冲数据并在完成后再次播放,形成循环。注意,在使用此模式时,调用 stop 方法不足以释放资源。
  • ReleaseMode.STOP - 停止音频播放但保留所有资源。如果打算稍后再播放,请使用此选项。

src

设置音频文件的 URL。可以是资产 URL,详见 Image.src 了解有关资产的更多信息。

备注

这里 是支持的音频格式列表。

src_base64

设置以 base-64 格式编码的音频文件内容。

volume

设置音量(幅度)。

0 为静音,1 为最大音量。0 和 1 之间的值线性插值。

方法

get_current_position()

返回当前播放位置(以毫秒为单位)。

get_duration()

返回音频持续时间(以毫秒为单位)。

pause()

暂停播放音频。

play()

从头开始播放音频。

release()

停止播放并释放与此音频控件相关的资源。 调用 resume() 或更改源时,资源将重新获取或缓冲。

resume()

从当前位置恢复播放音频。

seek()

将播放位置移动到所需位置。

方法参数:

  • position_milliseconds - 所需位置,以毫秒为单位。

事件

on_duration_changed

当音频持续时间可用时触发(可能需要一些时间下载或缓冲)。

事件的 e.data 包含音频持续时间(以毫秒为单位)。

on_loaded

音频加载/缓冲完成时触发。

on_position_changed

当音频位置变化时触发。如果状态为播放,每秒钟将持续更新播放位置。可以用于进度条。

on_seek_complete

音频定位完成时触发。定位完成后,将发送事件。

on_state_changed

当音频播放器状态变化时触发。事件的 e.data 包含以下状态之一:

  • stopped - 已停止
  • playing - 正在播放
  • paused - 已暂停
  • completed - 已完成
  • disposed - 已释放