视频 Video
视频播放控制。
基于 Dart/Flutter 包 media_kit
。
在 Linux 上,必须安装 libmpv
包。请参阅 此部分 了解更多信息。
要构建使用 Video
控件的 Flet 应用程序,请在 flet build
命令中添加 --include-packages flet_video
,例如:
flet build apk --include-packages flet_video
示例
基本示例
- Python
import random
import flet as ft
def main(page: ft.Page):
page.theme_mode = ft.ThemeMode.LIGHT
page.title = "TheEthicalVideo"
page.window.always_on_top = True
page.spacing = 20
page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
def handle_pause(e):
video.pause()
print("Video.pause()")
def handle_play_or_pause(e):
video.play_or_pause()
print("Video.play_or_pause()")
def handle_play(e):
video.play()
print("Video.play()")
def handle_stop(e):
video.stop()
print("Video.stop()")
def handle_next(e):
video.next()
print("Video.next()")
def handle_previous(e):
video.previous()
print("Video.previous()")
def handle_volume_change(e):
video.volume = e.control.value
page.update()
print(f"Video.volume = {e.control.value}")
def handle_playback_rate_change(e):
video.playback_rate = e.control.value
page.update()
print(f"Video.playback_rate = {e.control.value}")
def handle_seek(e):
video.seek(10000)
print(f"Video.seek(10000)")
def handle_add_media(e):
video.playlist_add(random.choice(sample_media))
print(f"Video.playlist_add(random.choice(sample_media))")
def handle_remove_media(e):
r = random.randint(0, len(video.playlist) - 1)
video.playlist_remove(r)
print(f"Popped Item at index: {r} (position {r+1})")
def handle_jump(e):
print(f"Video.jump_to(0)")
video.jump_to(0)
sample_media = [
ft.VideoMedia(
"https://user-images.githubusercontent.com/28951144/229373720-14d69157-1a56-4a78-a2f4-d7a134d7c3e9.mp4"
),
ft.VideoMedia(
"https://user-images.githubusercontent.com/28951144/229373718-86ce5e1d-d195-45d5-baa6-ef94041d0b90.mp4"
),
ft.VideoMedia(
"https://user-images.githubusercontent.com/28951144/229373716-76da0a4e-225a-44e4-9ee7-3e9006dbc3e3.mp4"
),
ft.VideoMedia(
"https://user-images.githubusercontent.com/28951144/229373695-22f88f13-d18f-4288-9bf1-c3e078d83722.mp4"
),
ft.VideoMedia(
"https://user-images.githubusercontent.com/28951144/229373709-603a7a89-2105-4e1b-a5a5-a6c3567c9a59.mp4",
extras={
"artist": "Thousand Foot Krutch",
"album": "The End Is Where We Begin",
},
http_headers={
"Foo": "Bar",
"Accept": "*/*",
},
),
]
page.add(
video := ft.Video(
expand=True,
playlist=sample_media[0:2],
playlist_mode=ft.PlaylistMode.LOOP,
fill_color=ft.colors.BLUE_400,
aspect_ratio=16/9,
volume=100,
autoplay=False,
filter_quality=ft.FilterQuality.HIGH,
muted=False,
on_loaded=lambda e: print("Video loaded successfully!"),
on_enter_fullscreen=lambda e: print("Video entered fullscreen!"),
on_exit_fullscreen=lambda e: print("Video exited fullscreen!"),
),
ft.Row(
wrap=True,
alignment=ft.MainAxisAlignment.CENTER,
controls=[
ft.ElevatedButton("Play", on_click=handle_play),
ft.ElevatedButton("Pause", on_click=handle_pause),
ft.ElevatedButton("Play Or Pause", on_click=handle_play_or_pause),
ft.ElevatedButton("Stop", on_click=handle_stop),
ft.ElevatedButton("Next", on_click=handle_next),
ft.ElevatedButton("Previous", on_click=handle_previous),
ft.ElevatedButton("Seek s=10", on_click=handle_seek),
ft.ElevatedButton("Jump to first Media", on_click=handle_jump),
ft.ElevatedButton("Add Random Media", on_click=handle_add_media),
ft.ElevatedButton("Remove Random Media", on_click=handle_remove_media),
],
),
ft.Slider(
min=0,
value=100,
max=100,
label="Volume = {value}%",
divisions=10,
width=400,
on_change=handle_volume_change,
),
ft.Slider(
min=1,
value=1,
max=3,
label="PlaybackRate = {value}X",
divisions=6,
width=400,
on_change=handle_playback_rate_change,
),
)
ft.app(target=main)
属性
alignment
定义视口的对齐方式。对齐方式是 Alignment
类的实例。
默认为 alignment.center
。
aspect_ratio
定义视频播放器的宽高比。
autoplay
是否自动播放视频。
fit
值是 ImageFit
枚举类型。默认为 NONE
。
filter_quality
视频输出的滤镜质量。值是 FilterQuality
枚举类型。默认为 LOW
。
::: 注意
在 Android 平台上,当使用 FilterQuality.HIGH
(高画质滤镜)时,视频会显示模糊图像。在这个平台上,建议使用 FilterQuality.MEDIUM
(中画质滤镜)。
:::
fill_color
定义视频背景的填充颜色。
muted
定义视频播放器是否在静音状态下启动。默认为 False
。
resume_upon_entering_foreground_mode
是否在应用程序进入前台模式时恢复视频播放。只有当 pause_upon_entering_background_mode
也设置为 True
时才有效。
show_controls
是否显示视频播放器控件。默认为 True
。
shuffle_playlist
定义是否随机播放播放列表。默认为 False
。
subtitle_configuration
定义视频播放器的字幕配置。值是 VideoSubtitleConfiguration
类型,具有以下属性:
src
- 字幕的来源(URL 或本地资产文件)title
- 字幕的标题language
- 字幕的语言text_style
- 字幕文本的样式text_scale_factor
- 字幕文本的缩放因子text_align
- 字幕文本的对齐方式padding
- 字幕文本的填充visible
- 是否显示字幕。
title
定义底层窗口和进程的名称,以便在 Windows 的音量混音器中可见。
volume
定义视频播放器的音量。值介于 0.0
和 100.0
之间(默认)。
pause_upon_entering_background_mode
是否在应用程序进入后台模式时暂停视频播放。
pitch
定义视频播放器的音高。默认为 1.0
。
playback_rate
定义视频播放器的播放速度。默认为 1.0
。
playlist
视频播放列表,consisting of VideoMedia
对象。该属性是只读的,可以在 Video
类实例化时设置一次。要后续修改它,请使用 playlist_add(media)
和 playlist_remove(media_index)
方法。
playlist_mode
表示播放列表的播放模式。PlaylistMode
支持以下值:
PlaylistMode.NONE
- 到达播放列表结尾时停止播放。PlaylistMode.SINGLE
- 无限循环当前播放的VideoMedia
。PlaylistMode.LOOP
- 循环播放播放列表,并在结尾时从头开始播放。
wakelock
是否在播放视频时获取唤醒锁。当 True
时,设备的显示器将不会在播放视频时进入待机/睡眠状态。
默认为 False
。
方法
get_current_position()
返回视频播放器的当前位置,以毫秒为单位。
get_duration()
返回当前播放的 VideoMedia
的持续时间,以毫秒为单位。
is_completed()
返回视频播放器是否已经到达当前播放的 VideoMedia
的结尾。
is_playing()
返回视频播放器当前是否在播放。如果在播放,则返回 True
,否则返回 False
。
jump_to(media_index)
跳转到 playlist
中指定索引(media_index
)的 VideoMedia
。
next()
跳转到 playlist
中的下一个 VideoMedia
。
pause()
暂停视频播放器。
play()
开始播放视频。
play_or_pause()
在视频播放器的播放和暂停状态之间循环切换。(如果暂停则播放,如果播放则暂停)
playlist_add(media)
将给定的 media
(类型为 VideoMedia
)添加到 playlist
的末尾。
playlist_remove(media_index)
从 playlist
中移除指定索引(media_index
)的 VideoMedia
。
previous()
跳转到 playlist
中的上一个 VideoMedia
。
seek(position_milliseconds)
按指定的毫秒数在 playlist
中查找当前播放的 VideoMedia
。
stop()
停止录制会话并释放内部录音资源。它返回一个字符串,即录制文件的位置。在 Web 上,它返回可以使用 page.launch_url()
打开的 blob。在其他平台上,它返回文件的路径,即传递给 start_recording()
方法的 output_path
参数。
事件
on_enter_fullscreen
当视频进入全屏时触发。
on_error
当发生错误时触发。
on_completed
当视频播放完成时触发。
on_track_changed
当视频轨道改变时触发,返回当前正在播放的轨道的整数。
on_exit_fullscreen
当视频退出全屏时触发。
on_loaded
当视频播放器初始化并准备好播放时触发。