我正在使用ffmpeg.exe
作为一个过程并将转换后的视频输出到内存,然后从内存中将数据保存到视频文件(这是我不能直接保存转换后的视频的要求到一个文件)。但是由于某种原因,该转换无法正常工作,这是我尝试过的,
var ffmpeg = HttpContext.Current.Server.MapPath("~/FFMpeg/ffmpeg.exe");
var outputDir = HttpContext.Current.Server.MapPath("~/Uploads/converted.mp4");
var inputDir = "https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_10mb.mp4";
var args = "-i " + inputDir + " -c:v libx264 -preset veryslow -crf 26 " +
"-ar 44100 -ac 2 -c:a aac -strict -2 -b:a 128k -";
var process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = ffmpeg;
process.StartInfo.WorkingDirectory = ffmpeg.Replace("\\ffmpeg.exe", "");
process.StartInfo.Arguments = args;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.EnableRaisingEvents = true;
//process.WaitForExit();
Stream output = process.StandardOutput.BaseStream;
process.Exited += (sender, e) =>
{
using (var fileStream = File.Create(outputDir))
{
output.Seek(0, SeekOrigin.Begin);
output.CopyTo(fileStream);
}
};
创建了输出文件converted.mp4
,但其文件大小为0 kb。
答案 0 :(得分:0)
据我了解,由于过程的时间长,IIS在终止应用程序之前甚至还无法完成任何值得狂野的事情。这并不意味着IIS无法触发外部程序来接管您,因此大多数情况下,您是将进程(.exe)从IIS用户空间转移到更合适的多线程用户空间中。您可以使用自己的队列管理系统,但是在过去,我使用了HangFire,因为它更适合执行此任务。使用hangfire,您可以提交转换文件的工作,并让它处理用户的请求,您只需在数据库中放置一个条目,即可显示FFMPEG正在转换的数据的状态。因此,当用户刷新页面时,它将轮询数据库以获取信息,而不是.exe本身的控制台输出(该信息会从刷新中清除)。