ffmpeg.exe freezes
本文关键字:freezes exe ffmpeg | 更新日期: 2023-09-27 18:05:07
我使用Asp。Net c# Framework 4,目前正在开发一个视频转换应用。我还使用ffmpeg从所有上传的格式转换为flv。我首先将上传的文件转换为mpg,然后由于我在尝试从mp4直接转换为flv时遇到的问题而转换为flv。但是ffmpeg一旦转换成mpg文件就会冻结。当我运行任务管理器并检查进程列表时,它只是站在那里,没有使用CPU资源。当我直接从任务管理器结束ffmpeg过程时,其他过程发生,从mpg转换为flv和预览文件(jpg)并顺利工作。由于第一个进程冻结,当我试图从我的网页的文件上传表单上传时,第二个进程无法启动。感谢你们的回复。下面是我的代码:
string duration = "00:00:00";
//converting video
Process ffmpeg;
ffmpeg = new Process();
// convert to mpg 1st
ffmpeg.StartInfo.Arguments = " -i '"" + Server.MapPath("static/user/vid/") + videolink + "'" -f mpeg -b 300k -ac 2 -ab 128k -ar 44K '"" + Server.MapPath("static/user/vid/") + mpglink + "'"";
ffmpeg.StartInfo.FileName = Page.MapPath("bin/ffmpeg.exe");
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.RedirectStandardOutput = true;
ffmpeg.StartInfo.RedirectStandardError = true;
ffmpeg.Start();
ffmpeg.WaitForExit();
ffmpeg.Close();
// mpg 2 flv
ffmpeg = new Process();
ffmpeg.StartInfo.Arguments = " -i '"" + Server.MapPath("static/user/vid/") + mpglink + "'" -f flv -s 624x352 '"" + Server.MapPath("static/user/vid/") + flvlink + "'"";
ffmpeg.StartInfo.FileName = Page.MapPath("bin/ffmpeg.exe");
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.RedirectStandardOutput = true;
ffmpeg.StartInfo.RedirectStandardError = true;
ffmpeg.Start();
ffmpeg.BeginOutputReadLine();
string error = ffmpeg.StandardError.ReadToEnd();
ffmpeg.WaitForExit();
try
{
duration = error.Substring(error.IndexOf("Duration: ") + 10, 8);
}
catch
{
}
if (ffmpeg.ExitCode != 0)
{
ltrUpload.Text = "<div class='"resultbox-negative'" id='"divResult'">Problem occured during upload process. Error code: " + error + "<br>" + "</div>";
return;
}
ffmpeg.Close();
// generate preview image
ffmpeg.StartInfo.Arguments = " -i '"" + Server.MapPath("static/user/vid/") + flvlink + "'" -s 624x352 -ss 00:00:03 -an -vframes 1 -f image2 -vcodec mjpeg '"" + Server.MapPath("static/user/vid/") + flvlink.Replace(".flv", ".jpg") + "'"";
ffmpeg.StartInfo.FileName = Page.MapPath("bin/ffmpeg.exe");
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.RedirectStandardOutput = true;
ffmpeg.StartInfo.RedirectStandardError = true;
ffmpeg.Start();
ffmpeg.WaitForExit();
ffmpeg.Close();
// deleting original file and mpg
FileInfo fi = new FileInfo(Server.MapPath("static/user/vid/") + videolink);
if (fi.Exists) fi.Delete();
fi = new FileInfo(Server.MapPath("static/user/vid/") + mpglink);
if (fi.Exists) fi.Delete();
我知道这是一个非常古老的问题,但如果有人因为谷歌搜索而来到这里,答案是:
您也必须读取第一个ffmpeg进程的重定向错误输出,即使您不需要它。如果不读取重定向错误输出,将导致死锁,因为程序将等待进程完成,而进程将等待读取填充的错误输出流。你可以在这里查阅。
// convert to mpg 1st
ffmpeg.StartInfo.Arguments = " -i '"" + Server.MapPath("static/user/vid/") + videolink + "'" -f mpeg -b 300k -ac 2 -ab 128k -ar 44K '"" + Server.MapPath("static/user/vid/") + mpglink + "'"";
ffmpeg.StartInfo.FileName = Page.MapPath("bin/ffmpeg.exe");
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.RedirectStandardOutput = true;
ffmpeg.StartInfo.RedirectStandardError = true;
ffmpeg.Start();
// Use asynchronous read operations on at least one of the streams.
// Reading both streams synchronously would generate another deadlock.
ffmpeg.BeginOutputReadLine();
string tmpErrorOut = ffmpeg.StandardError.ReadToEnd();
ffmpeg.WaitForExit();
ffmpeg.Close();
所以你必须读取重定向错误和输出流,就像你在第二个ffmpeg进程中所做的那样。
生成图像预览部分也是如此!
private bool ReturnVideo(string fileName)
{
string html = string.Empty;
//rename if file already exists
int j = 0;
string AppPath;
string inputPath;
string outputPath;
string imgpath;
AppPath = Request.PhysicalApplicationPath;
//Get the application path
inputPath = AppPath + "Upload''Videos''OriginalVideo";
//Path of the original file
outputPath = AppPath + "Upload''Videos''ConvertVideo";
//Path of the converted file
imgpath = AppPath + "Upload''Videos''Thumbs";
//Path of the preview file
string filepath = Server.MapPath("../Upload/Videos/OriginalVideo/" + fileName);
while (File.Exists(filepath))
{
j = j + 1;
int dotPos = fileName.LastIndexOf(".");
string namewithoutext = fileName.Substring(0, dotPos);
string ext = fileName.Substring(dotPos + 1);
fileName = namewithoutext + j + "." + ext;
filepath = Server.MapPath("../Upload/Videos/OriginalVideo/" + fileName);
}
try
{
this.fileuploadImageVideo.SaveAs(filepath);
}
catch
{
return false;
}
string outPutFile;
outPutFile = "../Upload/Videos/OriginalVideo/" + fileName;
int i = this.fileuploadImageVideo.PostedFile.ContentLength;
System.IO.FileInfo a = new System.IO.FileInfo(Server.MapPath(outPutFile));
while (a.Exists == false)
{ }
long b = a.Length;
while (i != b)
{ }
string cmd = " -i '"" + inputPath + "''" + fileName + "'" '"" + outputPath + "''" + fileName.Remove(fileName.IndexOf(".")) + ".flv" + "'"";
ConvertNow(cmd);
ViewState["fileName"] = fileName.Remove(fileName.IndexOf(".")) + ".wmv";
string imgargs = " -i '"" + inputPath + "''" + fileName.Remove(fileName.IndexOf(".")) + ".wmv" + "'" -f image2 -ss 1 -vframes 1 -s 280x200 -an '"" + imgpath + "''" + fileName.Remove(fileName.IndexOf(".")) + ".jpg" + "'"";
ConvertNow(imgargs);
return true;
}
private void ConvertNow(string cmd)
{
string exepath;
string AppPath = Request.PhysicalApplicationPath;
//Get the application path
exepath = AppPath + "ffmpeg.exe";
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = exepath;
//Path of exe that will be executed, only for "filebuffer" it will be "wmvtool2.exe"
proc.StartInfo.Arguments = cmd;
//The command which will be executed
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardOutput = false;
proc.Start();
while (proc.HasExited == false)
{ }
}
if (fileuploadImageVideo.HasFile)
{
ReturnVideo(this.fileuploadImageVideo.FileName.ToString());
string filename = fileuploadImageVideo.PostedFile.FileName;
fileuploadImageVideo.SaveAs(Server.MapPath("../upload/Video/"+filename));
objfun.Video = filename ;
}