为什么ffmpeg在进程的中间随机停止? [英] Why does ffmpeg stop randomly in the middle of a process?
问题描述
输出msg显示文件大小已结束。当我停止使用CPU时,我也会看到它的下降。我从视觉工作室复制了论据。 CD到同一个工作目录并运行cmd(bin / ffmpeg)并粘贴参数。它能够完成。
注意:我必须得到标准出来,并检查失败。
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,@无法处理请求,因为进程*已退出))
throw ex;
}
aa = app.StandardOutput.ReadToEnd();
aa2 = app.StandardError.ReadToEnd();
app.WaitForExit();
如果(aa2.IndexOf(找不到编解码器参数)!= -1)
return 1;
else if(aa ==DEAD|| aa2 ==DEAD)
return -1;
else if(aa2.Length!= 0)
return -2;
else
return 0;
}
stderr的输出。 stdout为空。
FFmpeg版本SVN-r15815,版权所有(c)2000-2008 Fabrice Bellard等人
配置:--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
建立于2008年11月13日10:28:29,gcc:4.2.4(MinGW的TDM-1)
输入#0,mov,mp4,m4a,3gp,3g2,mj2,从'C:持续时间:00:12:53.36,开始:0.000000,比特率:154 kb / s
流#0.0(und):音频:aac,44100 Hz,stereo,s16
输出#0,ipod,到'C:\dev\src\trunk\prjname\prjname流量#0.0(und):音频:libfaac,44100 Hz,立体声,s16,192 kb / s
流映射:
流#0.0 - > #0.0
按[q]停止编码
size = 87kB time = 4.74 bitrate = 150.7kbits / s
size = 168kB time = 9.06 bitrate = 151.9kbits / s
size = 265kB时间= 14.28比特率= 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比特率= 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.0 kbits / s
size = 1836kB time = 98.94 bitrate = 152.0kbits / s
size = 1971kB time = 106.25 bitr ate = 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 b itrate = 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.5 0 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
假设你在这里遇到了一个僵局。
来自 MSDN :
当您从
中读取所有文本时,都有类似的问题标准输出
和标准错误流。
遵循C#代码,例如
对
流执行读操作。
//不要在
//重定向流的末尾执行同步读取。
// string output = p.StandardOutput.ReadToEnd();
// string error = p.StandardError.ReadToEnd();
// p.WaitForExit();
//对至少一个流使用异步读取操作。
p.BeginOutputReadLine();
string error = p.StandardError.ReadToEnd();
p.WaitForExit();
代码示例避免了死锁
条件通过对StandardOutput
流执行异步
读操作。如果父进程调用
p.StandardOutput.ReadToEnd后跟
p.StandardError.ReadToEnd和
子进程将足够的文本写入
fill,死锁条件将生成
其错误流。父$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
孩子
进程将无限期地等待
父母从完整的
StandardError流中读取。
您可以使用异步读取
操作以避免这些依赖性
及其死锁潜力。
或者,您可以通过创建两个
线程并在单独的线程上读取每个
流的输出来避免
死锁条件。
< blockquote>
更新:当我使用ffmpeg,我写了一个包装器。主要思想是从
stderr
中解析每条输出行。因此,我能够识别转换死锁,并在必要时手动杀死转换过程。
它也有助于获取其他媒体信息,如持续时间和编解码器。
UPDATE2 (猜到最后一个)):as我上面提到我在异步模式下使用
stderr
来解析输出。另外,在正常(平均,非同步)模式下使用stdout
可以获得视频预览生成的结果(ffmpeg的功能)以获取结果而不使用临时文件。
希望这有帮助。
ffmpeg feels like its taking a long time. I then look at my output file and i see it stops between 6 and 8mbs. A fully encoded file is about 14mb. Why does ffmpeg stop? My code locks up on StandardOutput.ReadToEnd();. I had to kill the process (after seeing it not move for more then 10 seconds when i see it update every second previously) then i get the results of stdout and err. stdout is "" stderr is below.
The output msg shows the filesize ended. I also see a drop in my CPU usage when it stops. I copyed the argument from visual studios. CD to the same working directory and ran the cmd (bin/ffmpeg) and pasted the argument. It was able to complete.
NOTE: I must get std out and err to check for failures.
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; }
The output of stderr. stdout is empty.
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
解决方案Suppose you caught a deadlock here.
A reference from MSDN:
There is a similar issue when you read all text from both the standard output and standard error streams. The following C# code, for example, performs a read operation on both streams.
// 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();
The code example avoids the deadlock condition by performing asynchronous read operations on the StandardOutput stream. A deadlock condition results if the parent process calls p.StandardOutput.ReadToEnd followed by p.StandardError.ReadToEnd and the child process writes enough text to fill its error stream. The parent process would wait indefinitely for the child process to close its StandardOutput stream. The child process would wait indefinitely for the parent to read from the full StandardError stream.
You can use asynchronous read operations to avoid these dependencies and their deadlock potential. Alternately, you can avoid the deadlock condition by creating two threads and reading the output of each stream on a separate thread.
UPDATE: when I worked with ffmpeg, I wrote a wrapper to it. The main idea was to parse each output line from
stderr
. Due to this I was able to recognize conversion deadlocks and manually kill the conversion process when necessary. It also useful to obtain additional media information like duration and codecs used.UPDATE2(guess the last ;) ): as I mentioned above I used
stderr
in async mode to parse output. In additionstdout
was used in normal(mean, not async) mode to get the result of video preview generation (a feature of ffmpeg) to get result without using of temporary file.Hope, this helps.
这篇关于为什么ffmpeg在进程的中间随机停止?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!