From 1ba7fa25d54a6b5e931051b732646e2df20a53ff Mon Sep 17 00:00:00 2001 From: VirtualBrightPlayz Date: Sun, 2 Feb 2025 18:13:32 -0700 Subject: [PATCH 1/3] support ffmpeg video playback --- Assets/Scripts/Game/Video/FFVideoPlayer.cs | 128 ++++++++++++++++++ .../Scripts/Game/Video/FFVideoPlayer.cs.meta | 2 + .../Scripts/Game/Video/VideoPlayerManager.cs | 1 + Packages/manifest.json | 1 + Packages/packages-lock.json | 7 + 5 files changed, 139 insertions(+) create mode 100644 Assets/Scripts/Game/Video/FFVideoPlayer.cs create mode 100644 Assets/Scripts/Game/Video/FFVideoPlayer.cs.meta diff --git a/Assets/Scripts/Game/Video/FFVideoPlayer.cs b/Assets/Scripts/Game/Video/FFVideoPlayer.cs new file mode 100644 index 00000000..34d2307d --- /dev/null +++ b/Assets/Scripts/Game/Video/FFVideoPlayer.cs @@ -0,0 +1,128 @@ +using System; +using FFmpeg.Unity; +using Hypernex.CCK.Unity; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace Hypernex.Game.Video +{ + public class FFVideoPlayer : IVideoPlayer + { + private VideoPlayerDescriptor desc; + private FFPlayUnity videoPlayer; + private FFTexturePlayer texture; + private FFAudioPlayer audio; + private global::BufferAudioSource buffer; + private AudioSource audioSource; + private Material material; + + public FFVideoPlayer(VideoPlayerDescriptor descriptor) + { + GameObject attachedObject = descriptor.gameObject; + desc = descriptor; + videoPlayer = attachedObject.GetComponent(); + if (videoPlayer == null) + { + videoPlayer = attachedObject.AddComponent(); + videoPlayer.videoOffset = -0.5d; + texture = attachedObject.AddComponent(); + audio = attachedObject.AddComponent(); + audio.bufferSize = 2f; + videoPlayer.texturePlayer = texture; + videoPlayer.audioPlayer = audio; + } + audioSource = descriptor.AudioOutput; + if (audioSource == null) audioSource = attachedObject.GetComponent(); + if (audioSource == null) audioSource = attachedObject.AddComponent(); + buffer = audioSource.GetComponent(); + if (buffer == null) buffer = audioSource.gameObject.AddComponent(); + buffer.audioPlayer = videoPlayer.audioPlayer; + buffer.audioSource = audioSource; + videoPlayer.texturePlayer.OnDisplay += OnDisplay; + descriptor.AudioOutput = audioSource; + audioSource.outputAudioMixerGroup = Init.Instance.WorldGroup; + audioSource.spatialize = true; + descriptor.CurrentVideoPlayer = this; + } + + private void OnDisplay(Texture2D tex) + { + foreach (Renderer renderer in desc.VideoOutputs) + { + if (renderer.material == null) + { + renderer.material = new Material(Shader.Find("Universal Render Pipeline/Lit")); + desc.ShaderEmissionProperty = "_EmissionMap"; + } + renderer.material.mainTexture = tex; + renderer.material.mainTextureScale = new Vector2(1f, -1f); + if (desc.IsEmissive) + { + renderer.material.SetTexture(desc.ShaderEmissionProperty, tex); + renderer.material.SetTextureScale(desc.ShaderEmissionProperty, new Vector2(1f, -1f)); + } + } + } + + public static bool CanBeUsed() => true; + + public static bool CanBeUsed(Uri source) + { + // if (source.Scheme != "file") return false; + // TODO: Check to see if file is in compatible format + return true; + } + + public bool IsPlaying => videoPlayer.IsPlaying; + public bool Muted + { + get => audioSource.mute; + set => audioSource.mute = value; + } + + public bool Looping { get; set; } = false; + + public float Pitch + { + get => audioSource.pitch; + set => audioSource.pitch = value; + } + + public float Volume + { + get => audioSource.volume; + set => audioSource.volume = value; + } + + public double Position + { + get => videoPlayer.PlaybackTime; + set => videoPlayer.Seek(value); + } + + public double Length => videoPlayer.GetLength(); + + private string url; + public string Source + { + get => url; + set + { + if (url != value) + { + url = value; + videoPlayer.Play(url); + } + } + } + + public void Play() => videoPlayer.Resume(); + public void Pause() => videoPlayer.Pause(); + public void Stop() => videoPlayer.Pause(); + + public void Dispose() + { + Object.Destroy(material); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Game/Video/FFVideoPlayer.cs.meta b/Assets/Scripts/Game/Video/FFVideoPlayer.cs.meta new file mode 100644 index 00000000..62aae4ee --- /dev/null +++ b/Assets/Scripts/Game/Video/FFVideoPlayer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 05dd27ee639e21dcfacea6ba824fbf7f \ No newline at end of file diff --git a/Assets/Scripts/Game/Video/VideoPlayerManager.cs b/Assets/Scripts/Game/Video/VideoPlayerManager.cs index b6a4ad79..d726f4b6 100644 --- a/Assets/Scripts/Game/Video/VideoPlayerManager.cs +++ b/Assets/Scripts/Game/Video/VideoPlayerManager.cs @@ -26,6 +26,7 @@ static VideoPlayerManager() { // Register Built-In VideoPlayers Register(UnityVideoPlayer.CanBeUsed, UnityVideoPlayer.CanBeUsed); + Register(FFVideoPlayer.CanBeUsed, FFVideoPlayer.CanBeUsed); #if VLC Register(VLCVideoPlayer.CanBeUsed, VLCVideoPlayer.CanBeUsed); #endif diff --git a/Packages/manifest.json b/Packages/manifest.json index 6a29c1cc..f9bced22 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -19,6 +19,7 @@ "com.unity.xr.interaction.toolkit": "2.5.4", "com.unity.xr.management": "4.4.0", "com.unity.xr.openxr": "1.11.0", + "net.virtualwebsite.ffmpegunity": "https://github.com/VirtualBrightPlayz/FFmpeg.Unity.git?path=/Packages/FFmpeg.Unity#dynload", "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index a2d0a87a..4b3b3267 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -356,6 +356,13 @@ }, "url": "https://packages.unity.com" }, + "net.virtualwebsite.ffmpegunity": { + "version": "https://github.com/VirtualBrightPlayz/FFmpeg.Unity.git?path=/Packages/FFmpeg.Unity#dynload", + "depth": 0, + "source": "git", + "dependencies": {}, + "hash": "5a87f04a9c812610e03dbf3770eb337201105c5d" + }, "com.unity.modules.accessibility": { "version": "1.0.0", "depth": 0, From 8fb10545b38724472d53d4b737fc5e46d9630cd4 Mon Sep 17 00:00:00 2001 From: VirtualBrightPlayz Date: Sun, 2 Feb 2025 18:30:41 -0700 Subject: [PATCH 2/3] change youtubedlsharp to use the netstandard version --- Assets/Libs/YoutubeDLSharp/YoutubeDLSharp.dll | Bin 143872 -> 143872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Assets/Libs/YoutubeDLSharp/YoutubeDLSharp.dll b/Assets/Libs/YoutubeDLSharp/YoutubeDLSharp.dll index 814fc63921ee6ba4d24ca88dc95d9c9460c04d32..0b2ba7264031a48a7d3f52da6581ad49917a7c72 100644 GIT binary patch delta 43162 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≫T=W=l)dBf#%Y2(?`o;@vU(k4#k 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 Date: Mon, 3 Feb 2025 00:16:32 -0500 Subject: [PATCH 3/3] fix impl --- .../Libs/Hypernex.CCK/Hypernex.CCK.Unity.dll | Bin 2229760 -> 2229760 bytes Assets/Scripts/Game/Video/FFVideoPlayer.cs | 4 +++- Assets/Scripts/Game/Video/UnityVideoPlayer.cs | 1 + Assets/Scripts/Game/Video/VLCVideoPlayer.cs | 2 ++ .../Scripts/Game/Video/VideoPlayerManager.cs | 2 +- .../SandboxedTypes/Components/Video.cs | 4 ++-- 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Assets/Libs/Hypernex.CCK/Hypernex.CCK.Unity.dll b/Assets/Libs/Hypernex.CCK/Hypernex.CCK.Unity.dll index 5330923ee759111355dad41fcca5d11676a3604d..c3c965eb4718f4530f9c2afc5ecffde910fd09cc 100644 GIT binary patch delta 6939 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 videoPlayer.Pause(); public void Stop() => videoPlayer.Pause(); + public string GetFileHeader() => String.Empty; + public void Dispose() { Object.Destroy(material); diff --git a/Assets/Scripts/Game/Video/UnityVideoPlayer.cs b/Assets/Scripts/Game/Video/UnityVideoPlayer.cs index 2bfd4fff..7d3a775c 100644 --- a/Assets/Scripts/Game/Video/UnityVideoPlayer.cs +++ b/Assets/Scripts/Game/Video/UnityVideoPlayer.cs @@ -100,6 +100,7 @@ public string Source public void Play() => videoPlayer.Play(); public void Pause() => videoPlayer.Pause(); public void Stop() => videoPlayer.Stop(); + public string GetFileHeader() => "file:///"; public void Dispose() { diff --git a/Assets/Scripts/Game/Video/VLCVideoPlayer.cs b/Assets/Scripts/Game/Video/VLCVideoPlayer.cs index 8ab37b05..3cdc654e 100644 --- a/Assets/Scripts/Game/Video/VLCVideoPlayer.cs +++ b/Assets/Scripts/Game/Video/VLCVideoPlayer.cs @@ -172,6 +172,8 @@ public async void Stop() DestroyRenderTexture(); } + public string GetFileHeader() => "file:///"; + public bool IsStream { get; private set; } public VideoOrientation? GetVideoOrientation() diff --git a/Assets/Scripts/Game/Video/VideoPlayerManager.cs b/Assets/Scripts/Game/Video/VideoPlayerManager.cs index d726f4b6..6c7dc2f8 100644 --- a/Assets/Scripts/Game/Video/VideoPlayerManager.cs +++ b/Assets/Scripts/Game/Video/VideoPlayerManager.cs @@ -26,10 +26,10 @@ static VideoPlayerManager() { // Register Built-In VideoPlayers Register(UnityVideoPlayer.CanBeUsed, UnityVideoPlayer.CanBeUsed); - Register(FFVideoPlayer.CanBeUsed, FFVideoPlayer.CanBeUsed); #if VLC Register(VLCVideoPlayer.CanBeUsed, VLCVideoPlayer.CanBeUsed); #endif + Register(FFVideoPlayer.CanBeUsed, FFVideoPlayer.CanBeUsed); } public static void Register(Func canBeUsed, Func fileCanBePlayed) where T : IVideoPlayer diff --git a/Assets/Scripts/Sandboxing/SandboxedTypes/Components/Video.cs b/Assets/Scripts/Sandboxing/SandboxedTypes/Components/Video.cs index e7bb0af4..eb96c947 100644 --- a/Assets/Scripts/Sandboxing/SandboxedTypes/Components/Video.cs +++ b/Assets/Scripts/Sandboxing/SandboxedTypes/Components/Video.cs @@ -129,12 +129,12 @@ public void LoadFromStream(Streaming.StreamDownload streamDownload) { if (!File.Exists(streamDownload.pathToFile)) return; - string filePath = "file:///" + streamDownload.pathToFile; IVideoPlayer videoPlayer = videoPlayerDescriptor.Replace( - VideoPlayerManager.GetVideoPlayerType(new Uri(filePath)) ?? + VideoPlayerManager.GetVideoPlayerType(new Uri(streamDownload.pathToFile)) ?? VideoPlayerManager.DefaultVideoPlayerType); if (videoPlayer == null) return; + string filePath = videoPlayer.GetFileHeader() + streamDownload.pathToFile; videoPlayer.Source = filePath; } }