77 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SharedUI/Media
媒体通用视图与组件。
## WakeVideoPlayer
一个遵循项目 Theme 风格的 SwiftUI 视频播放组件,基于 `AVKit` 封装。
支持:
- 播放 / 暂停
- 进度条拖动(支持拖动中不打断播放进度回调)
- 静音切换
- 全屏播放(`fullScreenCover`
- 自动隐藏控件(播放中 2.5s 无操作自动隐藏)
- 自动播放与循环播放
- 自定义填充模式(`videoGravity`
### 用法示例
```swift
import SwiftUI
struct DemoVideoCard: View {
var body: some View {
WakeVideoPlayer(
url: URL(string: "https://devstreaming-cdn.apple.com/videos/wwdc/2020/10653/4/17B5F5F3-4D9E-4BAE-8E8F-2C3C7A01F3F2/cmaf.m3u8")!,
autoPlay: false,
isLooping: true,
showsControls: true,
allowFullscreen: true,
muteInitially: false,
videoGravity: .resizeAspectFill
)
.frame(height: 220)
.clipShape(RoundedRectangle(cornerRadius: Theme.CornerRadius.large, style: .continuous))
.shadow(color: Theme.Shadows.cardShadow.color, radius: Theme.Shadows.cardShadow.radius, x: Theme.Shadows.cardShadow.x, y: Theme.Shadows.cardShadow.y)
.padding()
}
}
```
### 初始化参数
- `url: URL` 必填。视频资源地址,支持网络或本地文件 URL。
- `autoPlay: Bool = true` 首次出现是否自动播放。
- `isLooping: Bool = false` 是否循环播放。
- `showsControls: Bool = true` 是否显示自定义控制层。
- `allowFullscreen: Bool = true` 是否允许进入全屏播放。
- `muteInitially: Bool = false` 初始是否静音。
- `videoGravity: AVLayerVideoGravity = .resizeAspectFill` 视频填充模式,如 `.resizeAspect` / `.resizeAspectFill`
- `fallbackURL: URL? = nil` 备用码流地址(建议提供 H.264/HLS。当检测到资源为 HEVC 且当前环境不支持硬解码(如模拟器)时,自动使用该地址播放。
### 注意事项
- 如果是新加入的文件,确保在 Xcode 中将 `WakeVideoPlayer.swift` 添加到对应 Target否则无法被编译。
- 远程流地址需确保允许跨域与 HTTPS示例使用 Apple 公共 HLS 资源。
- 如果需要画中画PiP、双击快退/快进、手势亮度/音量等高级功能,可在此基础上扩展。
### HEVC/H.265 支持说明与降级策略
- 模拟器通常不支持 HEVC 硬解码表现为“只有声音、无画面”。真机A9 及以上设备)通常支持。
- 组件会在加载时异步分析资源轨道编码;若检测到 HEVC 且当前环境不支持硬解码,则:
- 若提供了 `fallbackURL`(建议为 H.264 或多码率 HLS将自动切换播放该备用源
- 若未提供 `fallbackURL`,会显示顶部黄色提示,建议在真机测试或提供备用码流。
示例:
```swift
WakeVideoPlayer(
url: URL(string: "https://example.com/video_h265.mp4")!,
fallbackURL: URL(string: "https://example.com/video_h264.m3u8")!,
autoPlay: true,
isLooping: false,
showsControls: true,
allowFullscreen: true,
muteInitially: false,
videoGravity: .resizeAspect
)
.frame(height: 220)
```
建议优先使用 HLS.m3u8主清单内含多编码/多分辨率分流,兼容性更佳。