You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
4.2 KiB
130 lines
4.2 KiB
2 years ago
|
#if UNITY_STANDALONE_OSX || UNITY_STANDALONE_WIN || UNITY_EDITOR
|
||
|
using System;
|
||
|
using System.IO;
|
||
|
using System.Text;
|
||
|
using System.Diagnostics;
|
||
|
using System.Threading;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace FFmpeg
|
||
|
{
|
||
|
public class StandaloneProxy
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
public const string EDITOR_BINARY_PATH =
|
||
|
"FFmpeg/Standalone/" + PLATFORM + "/ffmpeg";
|
||
|
const string PLATFORM =
|
||
|
#if UNITY_EDITOR_OSX
|
||
|
"Mac";
|
||
|
#elif UNITY_EDITOR_WIN
|
||
|
"Win";
|
||
|
#endif
|
||
|
#endif
|
||
|
static string binaryPath;
|
||
|
static StringBuilder buffer;
|
||
|
static Action<string> callback;
|
||
|
static bool isRunning { get; set; }
|
||
|
|
||
|
#if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
|
||
|
[System.Runtime.InteropServices.DllImport("libc", EntryPoint = "chmod", SetLastError = true)]
|
||
|
static extern int sys_chmod(string path, uint mode);
|
||
|
#endif
|
||
|
|
||
|
//------------------------------
|
||
|
|
||
|
public static void Begin(Action<string> _callback)
|
||
|
{
|
||
|
#if UNITY_EDITOR
|
||
|
binaryPath = Path.Combine(Application.dataPath, EDITOR_BINARY_PATH);
|
||
|
//#elif UNITY_STANDALONE_OSX
|
||
|
// string buildDir = Directory.GetCurrentDirectory();
|
||
|
// binaryPath = Path.Combine(buildDir, "ffmpeg");
|
||
|
//#elif UNITY_STANDALONE_WIN
|
||
|
// string buildDir = Directory.GetCurrentDirectory();
|
||
|
// string dataDir = Directory.GetDirectories(buildDir, "*_Data")[0];
|
||
|
// binaryPath = Path.Combine(dataDir, "ffmpeg");
|
||
|
#elif UNITY_STANDALONE_WIN
|
||
|
string buildDir = Application.dataPath; //Directory.GetCurrentDirectory();
|
||
|
binaryPath = Path.Combine(buildDir, "ffmpeg");
|
||
|
#endif
|
||
|
|
||
|
if (!File.Exists(binaryPath))
|
||
|
{
|
||
|
string err = "Binary is not found at " + binaryPath;
|
||
|
_callback(err);
|
||
|
throw new FileNotFoundException(err);
|
||
|
}
|
||
|
|
||
|
#if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
|
||
|
//Grant permission to ffmpeg binary file work
|
||
|
sys_chmod(binaryPath, 755);
|
||
|
#endif
|
||
|
|
||
|
callback = _callback;
|
||
|
}
|
||
|
|
||
|
public static void Execute(string command)
|
||
|
{
|
||
|
if (isRunning)
|
||
|
return;
|
||
|
|
||
|
//Clear output buffer
|
||
|
buffer = new StringBuilder(short.MaxValue);
|
||
|
|
||
|
new Thread(() =>
|
||
|
{
|
||
|
isRunning = true;
|
||
|
Thread.CurrentThread.IsBackground = true;
|
||
|
|
||
|
//Execute binary
|
||
|
Process p = new Process();
|
||
|
p.StartInfo.RedirectStandardOutput = true;
|
||
|
p.StartInfo.RedirectStandardError = true;
|
||
|
p.StartInfo.UseShellExecute = false;
|
||
|
p.StartInfo.CreateNoWindow = true;
|
||
|
p.StartInfo.FileName = binaryPath;
|
||
|
p.StartInfo.Arguments = command;
|
||
|
|
||
|
p.OutputDataReceived += (s, e) =>
|
||
|
{
|
||
|
callback(FFmpegParser.COMMAND_CODE + FFmpegParser.PROGRESS_CODE + AppendLog(e.Data));
|
||
|
};
|
||
|
p.ErrorDataReceived += (s, e) =>
|
||
|
{
|
||
|
|
||
|
if (!string.IsNullOrEmpty(e.Data) && e.Data.ToLower().Contains("error"))
|
||
|
callback(FFmpegParser.ERROR_CODE + AppendLog(e.Data));
|
||
|
else
|
||
|
callback(FFmpegParser.COMMAND_CODE + FFmpegParser.PROGRESS_CODE + AppendLog(e.Data));
|
||
|
};
|
||
|
|
||
|
p.Start();
|
||
|
|
||
|
callback(FFmpegParser.COMMAND_CODE + FFmpegParser.START_CODE + "\nStarted\n");
|
||
|
|
||
|
p.BeginOutputReadLine();
|
||
|
p.BeginErrorReadLine();
|
||
|
|
||
|
p.WaitForExit();
|
||
|
|
||
|
callback(FFmpegParser.COMMAND_CODE +
|
||
|
(p.ExitCode == 0 ?
|
||
|
FFmpegParser.SUCCESS_CODE + AppendLog("Success!") :
|
||
|
FFmpegParser.FAILURE_CODE + AppendLog("Failure. Search details above")));
|
||
|
|
||
|
p.Close();
|
||
|
|
||
|
callback(FFmpegParser.COMMAND_CODE + FFmpegParser.FINISH_CODE + "\nFinished\n");
|
||
|
isRunning = false;
|
||
|
|
||
|
}).Start();
|
||
|
}
|
||
|
|
||
|
static string AppendLog(string msg)
|
||
|
{
|
||
|
return buffer.Append(msg).Append("\n").ToString();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
#endif
|