diff --git a/Unity Studio/Unity Classes/VideoClip.cs b/Unity Studio/Unity Classes/VideoClip.cs new file mode 100644 index 0000000..0b87f0b --- /dev/null +++ b/Unity Studio/Unity Classes/VideoClip.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Unity_Studio +{ + class VideoClip + { + public string m_Name; + public byte[] m_VideoData; + + public VideoClip(AssetPreloadData preloadData, bool readSwitch) + { + var sourceFile = preloadData.sourceFile; + var a_Stream = preloadData.sourceFile.a_Stream; + a_Stream.Position = preloadData.Offset; + + m_Name = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); + var m_OriginalPath = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); + var m_ProxyWidth = a_Stream.ReadUInt32(); + var m_ProxyHeight = a_Stream.ReadUInt32(); + var Width = a_Stream.ReadUInt32(); + var Height = a_Stream.ReadUInt32(); + var m_PixelAspecRatioNum = a_Stream.ReadUInt32(); + var m_PixelAspecRatioDen = a_Stream.ReadUInt32(); + var m_FrameRate = a_Stream.ReadDouble(); + var m_FrameCount = a_Stream.ReadUInt64(); + var m_Format = a_Stream.ReadInt32(); + //m_AudioChannelCount + var size = a_Stream.ReadInt32(); + a_Stream.Position += size * 2; + a_Stream.AlignStream(4); + //m_AudioSampleRate + size = a_Stream.ReadInt32(); + a_Stream.Position += size * 4; + //m_AudioLanguage + size = a_Stream.ReadInt32(); + for (int i = 0; i < size; i++) + { + a_Stream.ReadAlignedString(a_Stream.ReadInt32()); + } + //StreamedResource m_ExternalResources + var m_Source = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); + m_Source = Path.Combine(Path.GetDirectoryName(sourceFile.filePath), m_Source.Replace("archive:/", "")); + var m_Offset = a_Stream.ReadUInt64(); + var m_Size = a_Stream.ReadUInt64(); + var m_HasSplitAlpha = a_Stream.ReadBoolean(); + + if (readSwitch) + { + if (m_Source == null) + { + m_VideoData = a_Stream.ReadBytes((int)m_Size); + } + else if (File.Exists(m_Source) || File.Exists(m_Source = Path.Combine(Path.GetDirectoryName(sourceFile.filePath), Path.GetFileName(m_Source)))) + { + using (var reader = new BinaryReader(File.OpenRead(m_Source))) + { + reader.BaseStream.Position = (long)m_Offset; + m_VideoData = reader.ReadBytes((int)m_Size); + } + } + else + { + if (UnityStudio.assetsfileandstream.TryGetValue(Path.GetFileName(m_Source), out var reader)) + { + reader.Position = (long)m_Offset; + m_VideoData = reader.ReadBytes((int)m_Size); + } + else + { + MessageBox.Show($"can't find the resource file {Path.GetFileName(m_Source)}"); + } + } + } + else + { + preloadData.extension = Path.GetExtension(m_OriginalPath); + if (m_Name != "") { preloadData.Text = m_Name; } + else { preloadData.Text = preloadData.TypeString + " #" + preloadData.uniqueID; } + if (m_Source != null) + preloadData.fullSize = preloadData.Size + (int)m_Size; + preloadData.SubItems.AddRange(new[] { preloadData.TypeString, preloadData.fullSize.ToString() }); + } + } + } +} diff --git a/Unity Studio/Unity Studio Classes/UnityStudio.cs b/Unity Studio/Unity Studio Classes/UnityStudio.cs index 0cb8bfa..b5fbe05 100644 --- a/Unity Studio/Unity Studio Classes/UnityStudio.cs +++ b/Unity Studio/Unity Studio Classes/UnityStudio.cs @@ -312,6 +312,12 @@ namespace Unity_Studio ab = new AssetBundle(asset); break; } + case 329: //VideoClip + { + var m_VideoClip = new VideoClip(asset, false); + exportable = true; + break; + } case 21: //Material case 74: //AnimationClip case 90: //Avatar @@ -1809,6 +1815,14 @@ namespace Unity_Studio File.WriteAllText(exportPath, sb.ToString()); } + public static void ExportVideo(VideoClip m_VideoClip, string exportFilename) + { + if (m_VideoClip.m_VideoData != null) + { + File.WriteAllBytes(exportFilename, m_VideoClip.m_VideoData); + } + } + public static bool ExportFileExists(string filename) { if (File.Exists(filename)) diff --git a/Unity Studio/Unity Studio-x86.csproj b/Unity Studio/Unity Studio-x86.csproj index 841e158..b270d13 100644 --- a/Unity Studio/Unity Studio-x86.csproj +++ b/Unity Studio/Unity Studio-x86.csproj @@ -142,6 +142,7 @@ True + diff --git a/Unity Studio/Unity Studio.csproj b/Unity Studio/Unity Studio.csproj index 4090dc0..89c852a 100644 --- a/Unity Studio/Unity Studio.csproj +++ b/Unity Studio/Unity Studio.csproj @@ -142,6 +142,7 @@ ShaderResource.resx + diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs index bc37b13..17b893c 100644 --- a/Unity Studio/UnityStudioForm.cs +++ b/Unity Studio/UnityStudioForm.cs @@ -1102,11 +1102,22 @@ namespace Unity_Studio } break; #endregion - + #region VideoClip + case 329: + { + string str = asset.ViewStruct(); + if (str != null) + { + textPreviewBox.Text = str; + textPreviewBox.Visible = true; + } + break; + } + #endregion default: { - string str; - if ((str = asset.ViewStruct()) != null) + string str = asset.ViewStruct(); + if (str != null) { textPreviewBox.Text = str; textPreviewBox.Visible = true; @@ -1624,7 +1635,14 @@ namespace Unity_Studio ExportMesh(m_Mesh, exportpath + asset.Text + asset.extension); exportedCount++; } - + break; + case 329: //VideoClip + var m_VideoClip = new VideoClip(asset, true); + if (!ExportFileExists(exportpath + asset.Text + asset.extension)) + { + ExportVideo(m_VideoClip, exportpath + asset.Text + asset.extension); + exportedCount++; + } break; default: if (!ExportFileExists(exportpath + asset.Text + asset.extension))