Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一设置视频播放速度_C#_Performance_Video_Unity3d_Video Encoding - Fatal编程技术网

C# 统一设置视频播放速度

C# 统一设置视频播放速度,c#,performance,video,unity3d,video-encoding,C#,Performance,Video,Unity3d,Video Encoding,我的一般问题是,我需要播放和控制Unity3D世界中没有声音的视频的速度,可能需要自己控制解码,我完全不知道如何有效地做到这一点。因此,任何正确方向的提示都是受欢迎的 我需要在Unity中播放投影在材质上的视频,并且需要在运行时控制该视频的速度。当我瞄准移动设备时,我不能使用MovieTexture。也有其他选择,例如“轻松电影纹理”,但它们不允许我控制视频的速度 我发现了一个有问题的解决方案。简而言之,作者将视频分解为帧,然后逐帧显示。通过这种方式,我可以通过简单地更改显示下一帧之前的时间来控

我的一般问题是,我需要播放和控制Unity3D世界中没有声音的视频的速度,可能需要自己控制解码,我完全不知道如何有效地做到这一点。因此,任何正确方向的提示都是受欢迎的

我需要在Unity中播放投影在材质上的视频,并且需要在运行时控制该视频的速度。当我瞄准移动设备时,我不能使用MovieTexture。也有其他选择,例如“轻松电影纹理”,但它们不允许我控制视频的速度

我发现了一个有问题的解决方案。简而言之,作者将视频分解为帧,然后逐帧显示。通过这种方式,我可以通过简单地更改显示下一帧之前的时间来控制视频速度。视频没有任何声音,所以很简单。 问题是,从记忆和性能的角度来看,这是一场噩梦。这个应用程序会很大,而且效率很低

据我所知,普通的视频播放器通过不保存和显示每一帧而只是显示帧间的增量来解决这个问题。如果我能自己做,一帧一帧地控制它,我就能解决我的问题

我想象在运行时解码它,然后显示增量。但我不知道该怎么做。所以请给我指出正确的方向,或者如果你有,甚至给我一个解决方案


视频格式还没有固定,所以什么都是最简单的。

你不需要简单的电影纹理来完成这项工作,甚至不需要视频帧来完成这项工作

使用新的Unity VideoPlayer API,您可以检查是否可以使用设置平台上的播放速度。如果返回true,则只需更改属性即可设置视频播放速度

您可以使用其中的代码在RawImage上播放视频,然后添加下面的代码以设置播放速度

if (videoPlayer.canSetPlaybackSpeed)
{
    videoPlayer.playbackSpeed = 1f;
}
就这么简单

您提到希望将图像投影到材质上。在这种情况下,您应该将

下面的代码应该将视频投射到任何名为DisplayObject的游戏对象上。也可以在outputRenderer或outputRenderer.material变量中从视频访问材质

它有用于测试的音频,如果你不想要你在文章中提到的音频,你可以删除它


谢谢你的长而准确的回答。我现在有一个紧急的其他错误修复要做,但我会回来测试它,并将其标记为正确的,如果它工作:尤其重要的是它在移动设备上工作,例如Movietexture不工作,即使你从我的问题标题和标签中编辑了该部分…当人们说他们想在Unity中播放视频时,您应该自动假设视频应该在每个平台上都能正常工作。我看没有必要在看完问题后给手机贴标签。这个答案也适用于移动设备。谢谢你的回答。它确实回答了问题,因为它是在这里,可悲的是,它并不完全适合我。但我想我会问一个新问题。那个视频播放器已经让我更亲近了谢谢:
using UnityEngine;
using UnityEngine.Video;

public class VideoSpeedControl : MonoBehaviour
{
    //The material that Video will output to
    Renderer outputRenderer;

    private VideoPlayer videoPlayer;

    //Audio
    private AudioSource audioSource;

    void Start()
    {

        outputRenderer = gameObject.AddComponent<MeshRenderer>();

        //Add VideoPlayer to the GameObject
        videoPlayer = gameObject.AddComponent<VideoPlayer>();

        //Add AudioSource
        audioSource = gameObject.AddComponent<AudioSource>();

        //Disable Play on Awake for both Video and Audio
        videoPlayer.playOnAwake = false;
        audioSource.playOnAwake = false;

        // We want to play from url
        videoPlayer.source = VideoSource.Url;
        videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";

        //Set Audio Output to AudioSource
        videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;

        //Assign the Audio from Video to AudioSource to be played
        videoPlayer.EnableAudioTrack(0, true);
        videoPlayer.SetTargetAudioSource(0, audioSource);

        //Set the mode of output
        videoPlayer.renderMode = VideoRenderMode.MaterialOverride;

        //Set the renderer to store the images to
        //outputRenderer = videoPlayer.targetMaterialRenderer;
        videoPlayer.targetMaterialProperty = "_MainTex";

        //Prepare Video to prevent Buffering
        videoPlayer.Prepare();

        //Subscribe to prepareCompleted event
        videoPlayer.prepareCompleted += OnVideoPrepared;
    }

    void OnVideoPrepared(VideoPlayer source)
    {
        Debug.Log("Done Preparing Video");

        //Play Video
        videoPlayer.Play();

        //Play Sound
        audioSource.Play();

        //Change Play Speed
        if (videoPlayer.canSetPlaybackSpeed)
        {
            videoPlayer.playbackSpeed = 1f;
        }
    }

    bool firsrRun = true;
    void Update()
    {
        if (firsrRun)
        {
            GameObject.Find("DisplayObject").GetComponent<MeshRenderer>().material = outputRenderer.material;
            firsrRun = false;
        }
    }
}