VideoExtensions

1 阅读3分钟

概述(Overview)  

VideoExtensions 是一个非常轻量的静态扩展类,位于 PFGameFramework.Library 命名空间。

目前仅提供一个方法,用于在 WebGL 平台 或带有系统浏览器能力的环境下,通过 Application.OpenURL 调用系统默认播放器打开并播放指定的视频文件。

核心用途

  • 在 WebGL 构建中播放 StreamingAssets 目录下的 .mp4 视频
  • 在 Windows/Mac 桌面构建中打开本地视频文件(通过默认播放器)

适用场景

  • 教学视频、操作演示视频、实验录像播放
  • WebGL 项目中需要调用外部播放器的视频展示
  • 避免在 Unity 内嵌 VideoPlayer 组件(节省性能或兼容性考虑)

当前限制

  • 只支持 .mp4 格式(硬编码后缀)
  • 路径固定为 StreamingAssets/
  • 仅通过系统浏览器/播放器播放(非 Unity 内嵌播放)

方法一览(API Index)

方法名类型返回类型主要功能典型用途
PlayVideoToWebstaticvoid在系统浏览器中打开并播放 StreamingAssets 中的 .mp4 视频WebGL 视频播放、外部播放器调用

方法详情

PlayVideoToWeb

/// <summary>
/// 在网页端(WebGL)或系统浏览器中调用默认播放器打开并播放指定的 .mp4 视频文件。
/// 视频文件必须位于 StreamingAssets 目录下。
/// </summary>
/// <param name="fileName">视频文件名(不含 .mp4 后缀)</param>
/// <remarks>
/// 实际打开的路径为:Application.streamingAssetsPath + "/" + fileName + ".mp4"
/// 在 WebGL 中会触发浏览器打开新标签页或直接播放
/// 在桌面平台会调用系统默认视频播放器
/// </remarks>
public static void PlayVideoToWeb(string fileName)

调用示例

// 播放 StreamingAssets/MyDemo.mp4
VideoExtensions.PlayVideoToWeb("MyDemo");

// 带按钮触发示例
playButton.onClick.AddListener(() => 
{
    VideoExtensions.PlayVideoToWeb("OperationGuide");
});

文件放置位置(项目结构):

Assets/
  StreamingAssets/
    MyDemo.mp4
    OperationGuide.mp4
    Tutorial1.mp4

在代码中只需传入文件名(不带后缀):

PlayVideoToWeb("Tutorial1");   // 打开 StreamingAssets/Tutorial1.mp4

使用注意事项

  1. 平台差异

    • WebGL:调用 Application.OpenURL 会让浏览器尝试打开或播放视频(取决于浏览器设置)
    • Windows/Mac:会调用系统默认视频播放器(如 Windows Media Player、VLC、QuickTime)
    • Android/iOS:行为可能不一致,建议测试(可能打开浏览器或系统播放器)
  2. 文件路径限制

    • 必须放在 StreamingAssets 文件夹
    • 路径固定为 Application.streamingAssetsPath + "/" + fileName + ".mp4"
    • 不支持子文件夹(如 StreamingAssets/videos/xxx.mp4)
  3. 文件格式

    • 当前硬编码为 .mp4
    • 如需支持其他格式(.webm、.mov 等),可修改方法或增加重载
  4. WebGL 特殊性

    • WebGL 构建中 Application.OpenURL 会打开新标签页或触发下载
    • 浏览器可能直接内嵌播放,也可能提示下载(取决于文件头和浏览器策略)
  5. 错误处理

    • 当前方法没有异常捕获
    • 建议在实际使用时添加 try-catch:
try
{
    VideoExtensions.PlayVideoToWeb("GuideVideo");
}
catch (Exception e)
{
    Debug.LogError($"打开视频失败: {e.Message}");
}

改进建议

以下是当前实现可优化的方向:

  1. 支持子文件夹

    C#

    public static void PlayVideoToWeb(string relativePath, string fileName)
    {
        string fullPath = $"{Application.streamingAssetsPath}/{relativePath}/{fileName}.mp4";
        Application.OpenURL(fullPath);
    }
    
  2. 支持多种格式

    C#

    public static void PlayVideoToWeb(string fileName, string extension = ".mp4")
    {
        Application.OpenURL($"{Application.streamingAssetsPath}/{fileName}{extension}");
    }
    
  3. 添加回调或完成检测

    • 由于 Application.OpenURL 是系统调用,无法直接获取播放完成事件
    • 可考虑结合 UniTask 等待一段时间后执行后续逻辑
  4. WebGL 更友好方案

    • 在 WebGL 中使用 标签 + JavaScript 桥接实现内嵌播放
    • 或使用 Unity 的 VideoPlayer 组件(推荐替代方案)
  5. 错误提示

    • 在 WebGL 中可通过 JS 桥接检测文件是否存在