mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-26 13:50:21 -04:00
Support export VideoClip
This commit is contained in:
parent
38f1f068d2
commit
96c7aaabb0
90
Unity Studio/Unity Classes/VideoClip.cs
Normal file
90
Unity Studio/Unity Classes/VideoClip.cs
Normal file
@ -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() });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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))
|
||||
|
@ -142,6 +142,7 @@
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<Compile Include="Unity Classes\AssetBundle.cs" />
|
||||
<Compile Include="Unity Classes\VideoClip.cs" />
|
||||
<Compile Include="Unity Studio Classes\AssetPreloadData.cs" />
|
||||
<Compile Include="Unity Classes\AudioClip.cs" />
|
||||
<Compile Include="Unity Classes\BuildSettings.cs" />
|
||||
|
@ -142,6 +142,7 @@
|
||||
<DependentUpon>ShaderResource.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Unity Classes\AssetBundle.cs" />
|
||||
<Compile Include="Unity Classes\VideoClip.cs" />
|
||||
<Compile Include="Unity Studio Classes\AssetPreloadData.cs" />
|
||||
<Compile Include="Unity Classes\AudioClip.cs" />
|
||||
<Compile Include="Unity Classes\BuildSettings.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))
|
||||
|
Loading…
Reference in New Issue
Block a user