3.2 KiB
Raw Blame History

SharedUI/Media

媒体通用视图与组件。

WakeVideoPlayer

一个遵循项目 Theme 风格的 SwiftUI 视频播放组件,基于 AVKit 封装。

支持:

  • 播放 / 暂停
  • 进度条拖动(支持拖动中不打断播放进度回调)
  • 静音切换
  • 全屏播放(fullScreenCover
  • 自动隐藏控件(播放中 2.5s 无操作自动隐藏)
  • 自动播放与循环播放
  • 自定义填充模式(videoGravity

用法示例

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,会显示顶部黄色提示,建议在真机测试或提供备用码流。

示例:

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主清单内含多编码/多分辨率分流,兼容性更佳。