当通过c#net执行时,ffmpeg无法转换大小大于14mb的上传视频文件

当通过c#net执行时,ffmpeg无法转换大小大于14mb的上传视频文件,c#,asp.net,video,ffmpeg,C#,Asp.net,Video,Ffmpeg,我正在通过c#使用ffmpeg.exe将视频转换为flv,如果文件大小超过14mb,则过程将被卡住,转换将失败。我试图通过命令提示符直接运行ffmpeg,无论大小,它都可以正常工作 我的转换代码如下: OutputFile = SavePath + "SWF\\" + WithOutExt + ".flv"; FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}",InputFile,OutputFile); Process proc;

我正在通过c#使用ffmpeg.exe将视频转换为flv,如果文件大小超过14mb,则过程将被卡住,转换将失败。我试图通过命令提示符直接运行ffmpeg,无论大小,它都可以正常工作

我的转换代码如下:

OutputFile = SavePath + "SWF\\" + WithOutExt + ".flv";
FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}",InputFile,OutputFile);

Process proc;
proc = new Process();

try
{
     proc.StartInfo.FileName = spath + "\\ffmpeg\\ffmpeg.exe";
     proc.StartInfo.Arguments = FilArgs;
     proc.StartInfo.UseShellExecute = false;
     proc.StartInfo.CreateNoWindow = false;
     proc.StartInfo.RedirectStandardOutput = true;
     proc.StartInfo.RedirectStandardError = true;
     proc.Start();

     string StdOutVideo = proc.StandardOutput.ReadToEnd();
     string StdErrVideo = proc.StandardError.ReadToEnd();
 }
 finally
 {
     proc.WaitForExit();
     proc.Close();
 }
当我试图手动停止正在运行的进程时,
stderroutput
如下所示:

OutputFile = SavePath + "SWF\\" + WithOutExt + ".flv";
FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}",InputFile,OutputFile);

Process proc;
proc = new Process();

try
{
     proc.StartInfo.FileName = spath + "\\ffmpeg\\ffmpeg.exe";
     proc.StartInfo.Arguments = FilArgs;
     proc.StartInfo.UseShellExecute = false;
     proc.StartInfo.CreateNoWindow = false;
     proc.StartInfo.RedirectStandardOutput = true;
     proc.StartInfo.RedirectStandardError = true;
     proc.Start();

     string StdOutVideo = proc.StandardOutput.ReadToEnd();
     string StdErrVideo = proc.StandardError.ReadToEnd();
 }
 finally
 {
     proc.WaitForExit();
     proc.Close();
 }
FFmpeg版本SVN-r21231-Sherpya,版权(c)2000-2010 Fabrice Bellard等人。 根据gcc 4.2.5 20080919(预发布)于2010年1月16日05:42:31建造[Sherpya] libavutil 50。7.0 / 50. 7.0 libavcodec52.47。0 / 52.47. 0 libav52.47格式。0 / 52.47. 0 libav52设备。2.0 / 52. 2.0 libavfilter 1.15。0 / 1.15. 0 libswscale 0。8.0 / 0. 8.0 Libroc 51。2.0 / 51. 2.0 从“C:\Project Folder Files\ThirtySecondPitch\video\7.mp_c88a8ec2-3a60-4133-aee6-7e2d93b62324.mp4”输入#0、mov、mp4、m4a、3gp、3g2、mj2: 元数据: 主要品牌:isom 次要版本:512 兼容品牌:isomiso2mp41 持续时间:00:00:23.13,开始时间:0.000000,比特率:9261 kb/s 流#0.0(jpn):视频:mpeg4,yuv420p,1280x720[PAR 1:1 DAR 16:9],9128 kb/s,30 tbr,30 tbn,30 tbc 流#0.1(jpn):音频:aac,48000 Hz,立体声,S16127 kb/s 输出#0,flv到“C:\Project Folder Files\ThirtySecondPitch\video\SWF\7.mp_c88a8ec2-3a60-4133-aee6-7e2d93b62324.flv”: 流#0.0(jpn):视频:flv,yuv420p,1280x720[PAR 1:1 DAR 16:9],q=2-31200KB/s,1k tbn,30TBC 流#0.1(jpn):音频:libmp3lame,22050 Hz,立体声,s16,64 kb/s 流映射: 流#0.0->#0.0 流#0.1->0.1 按[q]停止编码 帧=19 fps=0 q=1.0大小=596kB时间=0.50比特率=9839.2kbit/s
帧=36 fps=33 q=1.0大小=1284kB时间=1.07比特率=9822.2kbit/s
帧=55fps=34q=1.0大小=2076kB时间=1.70比特率=10013.6kbits/s
帧=74 fps=35 q=1.0大小=2819kB时间=2.35比特率=9822.2kbit/s
帧=93 fps=35 q=1.0大小=3583kB时间=2.95比特率=9943.3kbits/s
帧=113 fps=36 q=1.0大小=4457kB时间=3.63比特率=10056.2kbit/s
帧=132 fps=36 q=1.0大小=5157kB时间=4.26比特率=9922.3kbits/s
帧=152 fps=37 q=1.0大小=5972kB时间=4.91比特率=9961.6kbits/s
帧=172 fps=37 q=1.0大小=6817kB时间=5.62比特率=9943.9kbits/s
帧=192 fps=37 q=1.0大小=7676kB时间=6.27比特率=10030.1kbits/s
帧=212 fps=37 q=1.0大小=8488kB时间=6.92比特率=10045.9kbits/s
帧=232 fps=37 q=1.0大小=9306kB时间=7.58比特率=10062.8kbits/s
帧=251 fps=37 q=1.0大小=10150kB时间=8.26比特率=10072.1kbits/s
帧=271 fps=37 q=1.0大小=10970kB时间=8.88比特率=10117.6kbits/s
帧=291fps=38q=1.0大小=11815kB时间=9.56比特率=10123.7kbits/s
帧=311 fps=38 q=1.0大小=12625kB时间=10.24比特率=10100.1kbits/s
帧=331fps=38q=1.0大小=13414kB时间=10.89比特率=10088.0kbit/s
帧=351 fps=38 q=1.0大小=14125kB时间=11.55比特率=10021.7kbits/s
帧=371 fps=38 q=1.0大小=14929kB时间=12.25比特率=9983.0kbit/s
帧=391 fps=38 q=1.0大小=15701kB时间=12.90比特率=9967.8kbits/s
帧=411fps=38q=1.0大小=16385kB时间=13.56比特率=9899.9kbits/s
帧=431 fps=38 q=1.0大小=17137kB时间=14.21比特率=9878.7kbits/s
帧=451fps=38q=1.0大小=17938kB时间=14.92比特率=9851.7kbits/s
帧=471 fps=38 q=1.0大小=18663kB时间=15.57比特率=9820.0kbit/s
帧=491 fps=38 q=1.0大小=19379kB时间=16.22比特率=9786.4kbits/s
帧=511fps=38q=1.0大小=20179kB时间=16.90比特率=9780.9kbits/s
帧=530 fps=38 q=1.0大小=20893kB时间=17.53比特率=9764.8kbits/s
帧=550 fps=38 q=1.0大小=21633kB时间=18.18比特率=9747.3kbits/s
帧=570 fps=38 q=1.0大小=22464kB时间=18.89比特率=9743.5kbit/s
帧=590 fps=38 q=1.0大小=23227kB时间=19.54比特率=9737.7kbits/s
帧=609fps=38q=1.0大小=23992kB时间=20.17比特率=9745.8kbits/s
帧=629 fps=38 q=1.0大小=24804kB时间=20.85比特率=9747.4KB/s
帧=648 fps=38 q=1.0大小=25501kB时间=21.45比特率=9740.6kbits/s
帧=668 fps=38 q=1.0大小=26306kB时间=22.13比特率=9739.7kbits/s

frame=687 fps=38 q=1.0 size=27040kB time=22.80比特率=9713.2kbit/s如果使用asp.net,我认为进程必须提前终止。我遇到了这个问题,我所做的解决方案是在服务器上运行一个服务,它轮询新文件并进行转换。工作正常,但您至少需要一个虚拟专用服务器,因为大多数共享主机不允许您的服务运行。

希望此代码对您有所帮助,请将此代码转换为C#form vb

将代码上载到服务器后,请使用此

Dim RootPath As String = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath)

问题不在于要转换的文件的大小

您正在尝试对两个重定向流的末尾执行两次同步读取。这可能会导致死锁(我猜:您已经抓住了它,因为文件更大)

因此,您应该对其中一行进行注释:

string StdOutVideo = proc.StandardOutput.ReadToEnd();
string StdErrVideo = proc.StandardError.ReadToEnd();
或者异步读取其中一个流


仅供参考:
ffmpeg
使用stderr进行日志记录(假设您想要捕获输出);并使用标准输出输出二进制数据(多媒体、快照等)。所以我看不出stdout重定向的真正原因。

正如Alex所说,问题可能是ReadToEnd()命令,解决问题的一种方法是创建事件处理程序,以便在出现输出或错误行时打印一行。这意味着您不会将它们全部添加到缓冲区中,并(可能)使进程挂起。下面的代码对我很有用,只需将log.Info()更改为您想使用的任何代码即可
process.OutputDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
        log.Info("Output Line: "+e.Data);
    }
);
process.ErrorDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
        log.Info("Error Line: "+e.Data);
    }
);
//start process
process.Start();
log.Info("process started");
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();