当前位置: 首页 > 编程语言 > C#

为什么ffmpeg在执行过程中会随机停止?分享

时间:2023-04-11 01:54:10 C#

为什么ffmpeg会在进程中途随机停止?ffmpeg感觉要花很长时间。然后我查看我的输出文件,发现它停在6到8mbs之间。完全编码的文件约为14mb。为什么ffmpeg会停止?我的代码锁定在StandardOutput.ReadToEnd();上。我不得不终止这个过程(看到它不会移动超过10秒,当我看到它每秒更新一次时)然后我得到了标准输出和错误的结果。stdoutis""stderr在下面。输出消息显示文件大小已超过。我还看到停止时CPU使用率下降。我从visualstudio复制了这个论点。CD到同一工作目录并运行cmd(bin/ffmpeg)并粘贴参数。可以办到。注意:我必须先退出并检查失败的错误。intsoundProcess(stringinfn,stringoutfn){stringaa,aa2;aa=aa2="死了";varapp=newProcess();app.StartInfo.UseShellExecute=false;app.StartInfo.RedirectStandardOutput=true;app.StartInfo.RedirectStandardError=true;//*/app.StartInfo.FileName=@"binffmpeg.exe";app.StartInfo.Arguments=string.Format(@"-i""{0}""-ab192k-y{2}""{1}""",infn,outfn,参数);应用程序开始();尝试{app.PriorityClass=ProcessPriorityClass.BelowNormal;}catch(Exceptionex){if(!Regex.IsMatch(ex.Message,@"Cannotprocessrequestbecausetheprocess.*hasexited"))throwex;}aa=app.StandardOutput.ReadToEnd();aa2=app.StandardError.ReadToEnd();app.WaitForExit();if(aa2.IndexOf("找不到编解码器参数")!=-1)return1;elseif(aa=="DEAD"||aa2=="DEAD")返回-1;elseif(aa2.Length!=0)返回-2;否则返回0;}stderr的输出。标准输出是空的。FFmpeg版本SVN-r15815,版权所有(c)2000-2008FabriceBellard等。配置:--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-pthreadslibavutil49.12。0/49.12。0libavcodec52.3.0/52.3.0libavformat52.23。1/52.23。1libavdevice52.1.0/52.1.0libswscale0.6.1/0.6.1libpostproc51.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:devsrctrunkprjnameprjnameApp_Data/temp/m/o/6304266424778814852':持续时间:00:12:53.36,开始:0.000000,比特率:154kb/sStream#0.0(und):Audio:aac,44100Hz,stereo,s16Output#0,ipod,to'C:devsrctrunkprjnameprjnameApp_Datatempmo2.m4a':Stream#0.0(und):音频:libfaac,44100赫兹,立体声,s16,192kb/sStreammapping:Stream#0.0->#0.0Press[q]tostopencodingsize=87kBtime=4.74bitrate=150.7kbits/ssize=168kBtime=9.06bitrate=151.9kbits/ssize=265kB时间=14.28比特率=151.8kbits/s大小=377kB时间=20.29比特率=152.1kbits/s大小=487kB时间=26.22比特率=152.1kbits/s大小=594kB时间=32.02比特率=152.1kbits/s大小=699kB时间=37.64比特率=152.1kbits/s大小=808kB时间=43.54比特率=152.0kbits/s大小=930kB时间=50.09比特率=152.2kbits/s大小=1058kB时间=57.05比特率=152.0kbits/s大小=1193kB时间=64.23比特率=152.1kbits/s大小=1329kB时间=71.63比特率=152.0kbits/s大小=1450kB时间=78.16比特率=152.0kbits/s大小=1578kB时间=85.05比特率=152.0kbits/s大小=1706kB时间=92.00比特率=152.0kbits/ssize=1836kBtime=98.94bitrate=152.0kbits/ssize=1971kBtime=106.25bitrate=151.9kbits/ssize=2107kBtime=113.57bitrate=152.0kbits/ssize=2214kBtime=119.33.bitrate0kbits2=15/s大小=2345kB时间=126.39比特率=152.0kbits/s大小=2479kB时间=133.56比特率=152.0kbits/s大小=2611kB时间=140.76比特率=152.0kbits/s大小=2745kB时间=147.91比特率=152.1kbits/s大小=2880kB时间=155.20比特率=152.0kbits/s大小=3013kB时间=162.40比特率=152.0kbits/s大小=3146kB时间=169.58比特率=152.0kbits/s大小=3277kB时间=176.61比特率=152.0kbits/s大小=3413.90比特率时间=18=152.0kbits/s大小=3540kB时间=190.80比特率=152.0kbits/s大小=3670kB时间=197.81比特率=152.0kbits/s大小=3805kB时间=205.08比特率=152.0kbits/s大小=3932kB时间=211.953.0比特率=152.0kbits/skbits/s大小=4052kB时间=218.38比特率=152.0kbits/s大小=4171kB时间=224.82比特率=152.0kbits/s大小=4277kB时间=230.55比特率=152.0kbits/s大小=4378kB时间=235.96比特率=152.0kbitss大小=4486kB时间=241.79比特率=152.0kbits/s大小=4592kB时间=247.50比特率=152.0kbits/s大小=4698kB时间=253.21比特率=152.0kbits/s大小=4804kB时间=258.95比特率=152.0kbits/s大小=4906kB时间=264.41比特率=152.0kbits/s大小=5012kB时间=270.09比特率=152.0kbits/s大小=5118kB时间=275.85比特率=152.0kbits/s大小=5234kB时间=282.12.0k比特率=15s/s大小=5331kB时间=287.39比特率=151.9kbits/s大小=5445kB时间=293.55比特率=152.0kbits/s大小=5555kB时间=299.40比特率=152.0kbits/s大小=5665kB时间=2.5kbits/305.37大小=5766k时间=310.80比特率=152.0kbits/s大小=5876kB时间=316.70比特率=152.0kbits/s大小=5984kB时间=322.50比特率=152.0kbits/s大小=6094kB时间=328.49比特大小=2bit/rate6212kB时间=334.76比特率152.0kbits/ssize=6327kBtime=340.99bitrate=152.0kbits/s假设你这里出现了死锁参考自MSDN:当你从标准输出和标准错误流中读取所有文本时,会出现类似的问题。例如,以下C#代码对两个流执行读取操作。//不要对两个重定向流的末尾执行同步读取。//字符串输出=p.StandardOutput.ReadToEnd();//字符串错误=p.StandardError.ReadToEnd();//p.WaitForExit();//对至少一个流使用异步读取操作。p.BeginOutputReadLine();字符串错误=p.StandardError.ReadToEnd();p.WaitForExit();操作以避免死锁情况。如果父进程调用p.StandardOutput.ReadToEnd,然后调用p.StandardError.ReadToEnd,并且子进程写入足够的文本来填充其错误流,则会导致死锁情况。父进程将无限期地等待子进程关闭其StandardOutput流。子进程将无限期地等待父进程从完整的StandardError流中读取。您可以通过使用异步读取操作来避免这些依赖关系及其潜在的死锁。或者,您可以通过创建两个线程并在单独的线程上读取每个流的输出来避免死锁情况。更新:当我使用ffmpeg时,我为它写了一个包装器。主要思想是解析来自stderr的每个输出行。结果,我能够识别转换死锁并在必要时手动终止转换过程。它还可用于获取其他媒体信息,例如持续时间和使用的编解码器。UPDATE2(猜最后一个;)):正如我上面提到的,我在异步模式下使用stderr来解析输出。另外,stdout在正常(平均,非异步)模式下用于获取视频预览(ffmpeg的一个功能)生成的结果,而不使用临时文件来获取结果。希望这可以帮助。以上是C#学习教程:ffmpeg为什么会在进程中途乱停?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: