2017-03-22 15 views
0

私の一般的な問題は、Unity3Dの世界でビデオのスピード(音なし)を再生して制御する必要があり、おそらく自分自身でデコードを制御する必要があり、それは効率的です。したがって、正しい方向のヒントは大歓迎です。Unityのビデオ再生速度を設定する

Unityで素材に投影されたビデオを再生する必要があり、実行時にそのビデオの速度を制御する必要があります。モバイルデバイスをターゲットにしているので、私はMovieTextureを使用できません。例えば、次のような選択肢がある。簡単なムービーテクスチャは、私はビデオの速度を制御することはできません。

私はこの問題の解決策を見つけましたpost。要するに、著者はビデオをそのフレームに分割し、それをフレームごとに表示します。このようにして、次のフレームを表示するまでの時間を変更するだけで、ビデオの速度を制御できます。ビデオには音がないので、簡単です。 問題は、これが記憶とパフォーマンスの観点からの悪夢であるということです。このアプリは大きくて非効率なGBです。

私が知る限り、通常のビデオプレーヤーはすべてのフレームを保存せずに表示するだけでなく、それらの間にデルタを表示することで解決します。もし私がそれを自分自身で行い、フレームごとにそれをコントロールできるなら、私は自分の問題を解決するだろう。

私はそれを実行時にデコードし、デルタを表示すると想像します。しかし、私はそれをどうやって行うのか分かりません。だから正しい方向に私を指してください、もしかすると私に解決策を与えてください。

ビデオフォーマットはまだ固定されていないので、最も簡単です。

答えて

1

これを行うには簡単なムービーテクスチャは必要ありません。また、これを行うにはビデオフレームを取得する必要はありません。

新しいUnity VideoPlayer APIを使用すると、プラットフォーム上で再生速度をVideoPlayer.canSetPlaybackSpeedに設定できるかどうかを確認できます。 trueが返された場合は、videoPlayer.playbackSpeedプロパティを変更するだけでビデオ再生速度を設定できます。

このanswerのコードを使用してRawImageの動画を再生し、次に再生速度を設定するコードを追加できます。

if (videoPlayer.canSetPlaybackSpeed) 
{ 
    videoPlayer.playbackSpeed = 1f; 
} 

これは簡単です。


あなたは、画像を素材に投影したいと述べました。このケースでは、「のDisplayObject」と呼ばれる任意のゲームオブジェクト上の映像を投写する必要があり、以下のVideoPlayer.renderMode

VideoRenderMode.MaterialOverride;にコードを設定する必要があります。また、outputRendererまたはoutputRenderer.material変数の動画から素材にアクセスすることもできます。

テスト用のオーディオがあります。あなたの投稿に記載されているようにオーディオが欲しくない場合は、オーディオを削除できます。

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; 
     } 
    } 
} 
+0

長くて正確な答えをありがとう。私は現在、緊急のバグ修正がありますが、私は戻ってテストし、それが正しいとマークします:) 編集したにもかかわらず、モバイルデバイスで動作することが特に重要です(例えば、Movietextureは機能しません)。私の質問のタイトルとタグからその部分... – findusl

+0

Unityでビデオを再生したいと言う人は、ビデオがすべてのプラットフォームで動作するはずだと自動的に判断する必要があります。質問を読んだ後、* mobile *にタグを付ける必要はありません。この回答はモバイルデバイスでも機能するはずです。 – Programmer

+0

あなたの答えをありがとう。それはここにある限り、質問に答えます。悲しいことに、私にとっては完全には機能しません。しかし、私はそれについて新しい質問をするだろうと思う。そのビデオプレイヤーはすでに私にもっと多くの感謝をもたらした:) – findusl

関連する問題