gpt4 book ai didi

c# - 如何统一反向播放视频?

转载 作者:行者123 更新时间:2023-12-04 22:50:25 25 4
gpt4 key购买 nike

我正在 Unity 中实现 VR 360 视频查看器,需要实现“反向播放”功能。我尝试过的一些方法(显然失败了):

  • 将 VideoPlayer 的播放速度字段设置为负数。
  • 结果:视频暂停
  • 使用此处建议的方法逐帧反转视频:How to Rewind Video Player in Unity?
  • 结果: super 延迟播放
  • 不要使用默认的 VideoPlayer,而是使用 Vive 媒体播放器(构建在 ffmpeg 之上)(https://assetstore.unity.com/packages/tools/video/vive-media-decoder-63938)。逐帧反转视频并强制渲染器在每次调用 Update() 时渲染帧,即使解码器的状态是 DecoderState.SEEK_FRAME。

  • 代码(基于 Assets 中的 ViveMediaDecoder.cs):
        //  Video progress is triggered using Update. Progress time would be set by nativeSetVideoTime.
    void Update() {
    Debug.Log(decoderState);
    switch (decoderState) {
    case DecoderState.START:
    if (isVideoEnabled) {
    // Prevent empty texture generate green screen.(default 0,0,0 in YUV which is green in RGB)
    if (useDefault && nativeIsContentReady(decoderID)) {
    getTextureFromNative();
    setTextures(videoTexYch, videoTexUch, videoTexVch);
    useDefault = false;
    }

    // Update video frame by dspTime.
    double setTime = AudioSettings.dspTime - globalStartTime;

    // Normal update frame.
    if (setTime < videoTotalTime || videoTotalTime == -1.0f) {
    if (seekPreview && nativeIsContentReady(decoderID)) {
    setPause();
    seekPreview = false;
    unmute();
    } else {
    nativeSetVideoTime(decoderID, (float) setTime);
    GL.IssuePluginEvent(GetRenderEventFunc(), decoderID);
    }
    } else {
    isVideoReadyToReplay = true;
    }
    }

    if (nativeIsVideoBufferEmpty(decoderID) && !nativeIsEOF(decoderID)) {
    decoderState = DecoderState.BUFFERING;
    hangTime = AudioSettings.dspTime - globalStartTime;
    }

    break;

    case DecoderState.SEEK_FRAME:

    //
    // Code Added:
    //

    setTime = AudioSettings.dspTime - globalStartTime;
    nativeSetVideoTime(decoderID, (float) setTime);
    GL.IssuePluginEvent(GetRenderEventFunc(), decoderID);

    //
    //

    if (nativeIsSeekOver(decoderID)) {
    globalStartTime = AudioSettings.dspTime - hangTime;
    decoderState = DecoderState.START;
    if (lastState == DecoderState.PAUSE) {
    seekPreview = true;
    mute();
    }
    }
    break;

    case DecoderState.BUFFERING:
    if (nativeIsVideoBufferFull(decoderID) || nativeIsEOF(decoderID)) {
    decoderState = DecoderState.START;
    globalStartTime = AudioSettings.dspTime - hangTime;
    }
    break;

    case DecoderState.PAUSE:
    case DecoderState.EOF:
    default:
    break;
    }

    if (isVideoEnabled || isAudioEnabled) {
    if ((!isVideoEnabled || isVideoReadyToReplay) && (!isAudioEnabled || isAllAudioChEnabled || isAudioReadyToReplay)) {
    decoderState = DecoderState.EOF;
    isVideoReadyToReplay = isAudioReadyToReplay = false;

    if (onVideoEnd != null) {
    onVideoEnd.Invoke();
    }
    }
    }
    }

    - 结果:视频暂停

    我目前通过预先生成反转视频并在用户想要倒带时切换到反转视频来解决这个问题。但是,考虑到我们的项目使用超过一个 360 视频并允许自定义视频,生成反转视频所需的时间和切换视频的滞后时间长得令人无法接受。

    由于该功能直观简单,我认为必须存在一个更简单的解决方案。已经陷入这个问题很长时间了,所以解决问题的任何指示都会有很大帮助!

    最佳答案

    根据我的经验,Unity 中的 videoPlayer 效率不是很高,并且在倒带时会滞后。

    我发现 EasyMovieTexture Assets 在视频渲染方面效果更好。

    关于c# - 如何统一反向播放视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50095298/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com