2022-08-26 Unity视频播放3——VideoPlayer


​ Video Player 顾名思义是视频播放器的意思,它是 Unity 提供给我们用于播放视频的组件

​ 该视频播放器组件,可以在游戏中播放导入的视频剪辑文件

​ 添加 Video Player 组件:

  • 方法一:在 Hierarchy 窗口点击加号,选择 Video -> Video Player
  • 方法二:选择场景上任何一个对象,为其添加 Video Player 组件
  • 方法三:直接将视频文件拖入到 Hierarchy 窗口中

一、Video Player 参数

image-20220826201153052
  1. Source:视频源

    • Video Clip:视频剪辑

      可以直接将视频剪辑拖入此处或者选择视频剪辑进行关联

    • URL:视频路径

      选择视频的路径,可以是远程视频路径,也可以之后通过代码直接关联视频资源路径

  2. Play On Awake:场景启动时就播放视频

    如果希望自己控制播放时机,请取消该选项

  3. Wait For First Frame:如果勾选该选项,Unity 将等待视频第一帧准备好显示

    如果取消勾选,可能会丢弃前几帧使视频时间与游戏保持同步

  4. Loop:是否循环播放

  5. Skip On Drop:是否允许视频播放器跳过帧以赶上当前时间

  6. Playback Speed:表示播放速度的乘数,0~10之间的值

    1 表示正常速度,如果数值为 2,则视频速度 ❌ 2,表示两倍速播放

  7. Render Mode:渲染方式

    image-20220826201651856
    • Camera Far Plane:在摄像机的远平面上渲染

      • Camera:定义接受视频的摄像机

      • Alpha:视频的全局透明度

      • 3D Layout:

        如果视频分为了左右双眼,设置为 Side by Side
        如果左右侧内容在视频中上下分部,设置为 Over Under

    • Camera Near Plane:在摄像机的近平面上渲染

    • Render Texture:将视频渲染到渲染纹理中

    • Material Override:通过游戏对象渲染器的材质将视频渲染到游戏对象的选定纹理属性中

    • API Only:不预先设置渲染到哪里,通过代码来设置视频渲染到哪里

      通过 Video Player 中的 texture 属性进行设置

  8. Aspect Ratio:宽高比设置

    image-20220826202212785
    • No Scaling:不使用缩放

    • Fit Vertically:垂直适应目标矩形

      必要时裁剪左侧和右侧或在每侧留下黑色区域,以保留原视频的宽高比

    • Fit Horizontally:水平适应目标矩形

      必要时裁剪顶部和底部或在顶或底留下黑色区域,以保留原视频的宽高比

    • Fit Inside:对原视频进行缩放而不必裁剪,但是可能会留黑边

    • Fit Outside:对原视频进行缩放,可能需要进行裁剪,但是不会留黑边

    • Stretch:在水平和垂直方向均进行缩放以适应目标矩形。不会保留源宽高比

  9. Audio Output Mode:如何输出视频源的音频

    • None:不播放音频

    • Audio Source:发送给指定的音频源对象,允许 Unity 的音频处理

    • Direct:直接绕过 Unity 音频处理,发送给音频输出硬件输出

      Mute —— 静音;Volume —— 音量。

    • API Only:通过代码将音频样本发送到关联的 AudioSampleProvider 听诊器

  10. Track Enabled:启用关联的音频轨道用于播放,必须在播放前设置

    比如:Track 0[en, 2 ch] 表示有一个音频轨道,语言是 en, 并且音频轨道有 2 个声道(2 ch),表示它是双声道音频轨道

二、通过代码使用 Video Player

using UnityEngine.Video; // 注意:使用VideoPlayer组件需要引用命名空间UnityEngine.Video

public  RenderTexture texture;
public  VideoClip     clip;
private VideoPlayer   videoPlayer;
private bool          isOver = false;

void Start() {
    
    
    // 1.将一个 VideoPlayer 附加到主摄像机。
    //   将 VideoPlayer 添加到摄像机对象时,
    //   它会自动瞄准摄像机背板,无需更改 videoPlayer.targetCamera。
    GameObject camera = GameObject.Find("Main Camera");
    videoPlayer = camera.AddComponent<VideoPlayer>();

    // 2.参数相关设置
    //   是否自动播放
    videoPlayer.playOnAwake = false;
    //   渲染模式
    videoPlayer.renderMode = VideoRenderMode.CameraFarPlane;
    // 设置目标 渲染贴图
    // videoPlayer.targetTexture = texture;
    // 设置目标摄像机
    // videoPlayer.targetCamera

    //   透明度
    videoPlayer.targetCameraAlpha = 0.5f;
    // videoPlayer.targetCamera3DLayout = Video3DLayout.OverUnder3D;

    //   视频源
    videoPlayer.source = VideoSource.VideoClip;
    videoPlayer.clip   = clip;

    // videoPlayer.source = VideoSource.Url;
    // videoPlayer.url = Application.streamingAssetsPath + "/Video.mp4";

    //   是否循环
    videoPlayer.isLooping = false;

    //   视频总时长
    print(videoPlayer.length); // 单位为s
    //   当前时长,播放了多久
    print(videoPlayer.time); // 单位为s

    //   总帧数
    print(videoPlayer.frameCount);
    //   当前帧
    print(videoPlayer.frame);


    // 3.方法相关
    //   播放、停止、暂停

    //   准备函数
    videoPlayer.Prepare();

    // 4.事件相关
    //   准备完成事件
    videoPlayer.prepareCompleted += (v) => {
    
    
        print("准备完成");
        isOver = true;
    };

    //   开始事件
    videoPlayer.started += (v) => {
    
     print("当执行player播放方法后 会调用的事件"); };

    //   结尾时调用事件
    videoPlayer.loopPointReached += (v) => {
    
     print("视频播放到结尾处时会调用的事件"); };
}

// Update is called once per frame
void Update() {
    
    
    if (Input.GetKeyDown(KeyCode.Space) && isOver) {
    
    
        // 视频播放
        videoPlayer.Play();
    }

    if (Input.GetKeyDown(KeyCode.S) && isOver) {
    
    
        // 视频停止
        videoPlayer.Stop();
    }

    if (Input.GetKeyDown(KeyCode.P) && isOver) {
    
    
        // 视频暂停
        videoPlayer.Pause();
    }
}

猜你喜欢

转载自blog.csdn.net/zheliku/article/details/126550674
今日推荐