gpt4 book ai didi

c# - 为什么 ffmpeg 在进程中随机停止?

转载 作者:行者123 更新时间:2023-12-02 17:24:53 25 4
gpt4 key购买 nike

ffmpeg 感觉花了很长时间。然后我查看输出文件,发现它停在 6 到 8mbs 之间。完整编码的文件大约为 14mb。为什么 ffmpeg 停止了?我的代码锁定在 StandardOutput.ReadToEnd(); 上。我不得不终止该进程(当我看到它之前每秒更新一次时,它已经不动了超过 10 秒),然后我得到了 stdout 和 err 的结果。标准输出是“”标准错误在下面。

输出消息显示文件大小已结束。当它停止时,我还发现 CPU 使用率下降。我复制了 Visual Studio 的论点。 CD 到同一工作目录并运行 cmd (bin/ffmpeg) 并粘贴参数。它能够完成。

注意:我必须取出 std 并 err 来检查故障。

    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 的输出。标准输出为空。

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

最佳答案

假设您在这里遇到了僵局。

来自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.

更新:当我使用 ffmpeg 时,我为其编写了一个包装器。主要思想是解析来自 stderr 的每个输出行。因此,我能够识别转换死锁,并在必要时手动终止转换过程。它对于获取额外的媒体信息(例如持续时间和使用的编解码器)也很有用。

UPDATE2(猜猜最后一个;)):正如我上面提到的,我在异步模式下使用 stderr 来解析输出。此外,在正常(平均,非异步)模式下使用 stdout 来获取视频预览生成的结果(ffmpeg 的一项功能),从而在不使用临时文件的情况下获取结果。

希望这会有所帮助。

关于c# - 为什么 ffmpeg 在进程中随机停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2471656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com