C# 为什么FFPEG在过程中间随机停止?
ffmpeg感觉需要很长时间。然后我查看我的输出文件,我看到它在6到8MB之间停止。一个完全编码的文件大约14mb。为什么ffmpeg停止了?我的代码锁定在StandardOutput.ReadToEnd();。我不得不终止这个进程(当我看到它之前每秒钟更新一次时,它在超过10秒钟内没有移动),然后我得到stdout和err的结果。标准值为“”标准值如下 输出消息显示文件大小已结束。当CPU停止使用时,我也会看到CPU使用率下降。我从视觉工作室复制了这个论点。CD到同一工作目录,运行cmd(bin/ffmpeg)并粘贴参数。它能够完成 注意:我必须获得std和err以检查故障C# 为什么FFPEG在过程中间随机停止?,c#,asp.net,ffmpeg,pipe,deadlock,C#,Asp.net,Ffmpeg,Pipe,Deadlock,ffmpeg感觉需要很长时间。然后我查看我的输出文件,我看到它在6到8MB之间停止。一个完全编码的文件大约14mb。为什么ffmpeg停止了?我的代码锁定在StandardOutput.ReadToEnd();。我不得不终止这个进程(当我看到它之前每秒钟更新一次时,它在超过10秒钟内没有移动),然后我得到stdout和err的结果。标准值为“”标准值如下 输出消息显示文件大小已结束。当CPU停止使用时,我也会看到CPU使用率下降。我从视觉工作室复制了这个论点。CD到同一工作目录,运行cmd(bi
int soundProcess(string infn, string outfn)
{
string aa, aa2;
aa = aa2 = "DEAD";
var app = new Process();
app.StartInfo.UseShellExecute = false;
app.StartInfo.RedirectStandardOutput = true;
app.StartInfo.RedirectStandardError = true;
//*/
app.StartInfo.FileName = @"bin\ffmpeg.exe";
app.StartInfo.Arguments = string.Format(@"-i ""{0}"" -ab 192k -y {2} ""{1}""", infn, outfn, param);
app.Start();
try
{
app.PriorityClass = ProcessPriorityClass.BelowNormal;
}
catch (Exception ex)
{
if (!Regex.IsMatch(ex.Message, @"Cannot process request because the process .*has exited"))
throw ex;
}
aa = app.StandardOutput.ReadToEnd();
aa2 = app.StandardError.ReadToEnd();
app.WaitForExit();
if (aa2.IndexOf("could not find codec parameters") != -1)
return 1;
else if (aa == "DEAD" || aa2 == "DEAD")
return -1;
else if (aa2.Length != 0)
return -2;
else
return 0;
}
stderr的输出。stdout是空的
FFmpeg version SVN-r15815, Copyright (c) 2000-2008 Fabrice Bellard, et al.
configuration: --enable-memalign-hack --enable-postproc --enable-swscale --enable-gpl --enable-libfaac --enable-libfaad --enable-libgsm --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libx264 --enable-libxvid --disable-ffserver --disable-vhook --enable-avisynth --enable-pthreads
libavutil 49.12. 0 / 49.12. 0
libavcodec 52. 3. 0 / 52. 3. 0
libavformat 52.23. 1 / 52.23. 1
libavdevice 52. 1. 0 / 52. 1. 0
libswscale 0. 6. 1 / 0. 6. 1
libpostproc 51. 2. 0 / 51. 2. 0
built on Nov 13 2008 10:28:29, gcc: 4.2.4 (TDM-1 for MinGW)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\dev\src\trunk\prjname\prjname\App_Data/temp/m/o/6304266424778814852':
Duration: 00:12:53.36, start: 0.000000, bitrate: 154 kb/s
Stream #0.0(und): Audio: aac, 44100 Hz, stereo, s16
Output #0, ipod, to 'C:\dev\src\trunk\prjname\prjname\App_Data\temp\m\o\2.m4a':
Stream #0.0(und): Audio: libfaac, 44100 Hz, stereo, s16, 192 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Press [q] to stop encoding
size= 87kB time=4.74 bitrate= 150.7kbits/s
size= 168kB time=9.06 bitrate= 151.9kbits/s
size= 265kB time=14.28 bitrate= 151.8kbits/s
size= 377kB time=20.29 bitrate= 152.1kbits/s
size= 487kB time=26.22 bitrate= 152.1kbits/s
size= 594kB time=32.02 bitrate= 152.1kbits/s
size= 699kB time=37.64 bitrate= 152.1kbits/s
size= 808kB time=43.54 bitrate= 152.0kbits/s
size= 930kB time=50.09 bitrate= 152.2kbits/s
size= 1058kB time=57.05 bitrate= 152.0kbits/s
size= 1193kB time=64.23 bitrate= 152.1kbits/s
size= 1329kB time=71.63 bitrate= 152.0kbits/s
size= 1450kB time=78.16 bitrate= 152.0kbits/s
size= 1578kB time=85.05 bitrate= 152.0kbits/s
size= 1706kB time=92.00 bitrate= 152.0kbits/s
size= 1836kB time=98.94 bitrate= 152.0kbits/s
size= 1971kB time=106.25 bitrate= 151.9kbits/s
size= 2107kB time=113.57 bitrate= 152.0kbits/s
size= 2214kB time=119.33 bitrate= 152.0kbits/s
size= 2345kB time=126.39 bitrate= 152.0kbits/s
size= 2479kB time=133.56 bitrate= 152.0kbits/s
size= 2611kB time=140.76 bitrate= 152.0kbits/s
size= 2745kB time=147.91 bitrate= 152.1kbits/s
size= 2880kB time=155.20 bitrate= 152.0kbits/s
size= 3013kB time=162.40 bitrate= 152.0kbits/s
size= 3146kB time=169.58 bitrate= 152.0kbits/s
size= 3277kB time=176.61 bitrate= 152.0kbits/s
size= 3412kB time=183.90 bitrate= 152.0kbits/s
size= 3540kB time=190.80 bitrate= 152.0kbits/s
size= 3670kB time=197.81 bitrate= 152.0kbits/s
size= 3805kB time=205.08 bitrate= 152.0kbits/s
size= 3932kB time=211.93 bitrate= 152.0kbits/s
size= 4052kB time=218.38 bitrate= 152.0kbits/s
size= 4171kB time=224.82 bitrate= 152.0kbits/s
size= 4277kB time=230.55 bitrate= 152.0kbits/s
size= 4378kB time=235.96 bitrate= 152.0kbits/s
size= 4486kB time=241.79 bitrate= 152.0kbits/s
size= 4592kB time=247.50 bitrate= 152.0kbits/s
size= 4698kB time=253.21 bitrate= 152.0kbits/s
size= 4804kB time=258.95 bitrate= 152.0kbits/s
size= 4906kB time=264.41 bitrate= 152.0kbits/s
size= 5012kB time=270.09 bitrate= 152.0kbits/s
size= 5118kB time=275.85 bitrate= 152.0kbits/s
size= 5234kB time=282.10 bitrate= 152.0kbits/s
size= 5331kB time=287.39 bitrate= 151.9kbits/s
size= 5445kB time=293.55 bitrate= 152.0kbits/s
size= 5555kB time=299.40 bitrate= 152.0kbits/s
size= 5665kB time=305.37 bitrate= 152.0kbits/s
size= 5766kB time=310.80 bitrate= 152.0kbits/s
size= 5876kB time=316.70 bitrate= 152.0kbits/s
size= 5984kB time=322.50 bitrate= 152.0kbits/s
size= 6094kB time=328.49 bitrate= 152.0kbits/s
size= 6212kB time=334.76 bitrate= 152.0kbits/s
size= 6327kB time=340.99 bitrate= 152.0kbits/s
假设你在这里遇到了僵局 参考资料来自: 当你阅读时,也有类似的问题 标准输出和标准输出中的所有文本 和标准错误流。这个 例如,遵循C#代码, 对两个磁盘执行读取操作 溪流 代码示例避免了死锁 通过执行异步 读取标准输出上的操作 流动结果出现死锁条件 如果父进程调用 p、 StandardOutput.ReadToEnd后跟 p、 StandardError.ReadToEnd和 子进程将足够的文本写入 填充它的错误流。父母 进程将无限期地等待 子进程关闭其 标准输出流。孩子 进程将无限期地等待 要从全文中读取的父级 标准错误流 您可以使用异步读取 避免这些依赖关系的操作 以及他们的僵局潜力。 或者,您可以避免 通过创建两个 线程并读取每个线程的输出 在单独的线程上执行流 更新:当我使用ffmpeg时,我给它写了一个包装器。主要思想是解析
stderr
中的每个输出行。因此,我能够识别转换死锁,并在必要时手动终止转换过程。
获取额外的媒体信息(如持续时间和使用的编解码器)也很有用
UPDATE2(猜最后一个;):如上所述,我在异步模式下使用了stderr
来解析输出。此外,stdout
在正常(平均,非异步)模式下使用,以获得视频预览生成的结果(ffmpeg的一个特性),从而在不使用临时文件的情况下获得结果
希望,这有帮助。天哪,谢谢!你救了我。我永远都不会知道。你也给我写了这个答案!?!哇,谢谢。你是个救命恩人(是的,今天所有的投票都是在看到你的管道代码后我投的。)
// Do not perform a synchronous read to the end of both
// redirected streams.
// string output = p.StandardOutput.ReadToEnd();
// string error = p.StandardError.ReadToEnd();
// p.WaitForExit();
// Use asynchronous read operations on at least one of the streams.
p.BeginOutputReadLine();
string error = p.StandardError.ReadToEnd();
p.WaitForExit();