zzcvs 2022-01-14 18:38 采纳率: 0%
浏览 138

C# 调用外部ffmpeg.exe,稳定运行一段时间以后,突然出现无法转换的情况,有ErrorDataReceived运行日志,但是没有转换后的mp4视频

C# 调用外部ffmpeg.exe转换avi成mp4
代码如下:

 Process p = new Process();
                        try
                        {
                            p.StartInfo.FileName = Application.StartupPath + "\\" + "ffmpeg.exe";
                            p.StartInfo.UseShellExecute = false;
                            p.StartInfo.Arguments = "-i " + item.FilePath + " -y -vcodec h264 -threads 6 -crf 25 " + VideoName + videoAfterFormat + "\"";   //执行参数
                            p.StartInfo.CreateNoWindow = true;  //不显示dos程序窗口
                            p.StartInfo.RedirectStandardInput = true;
                            p.StartInfo.RedirectStandardOutput = true;
                            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中
                            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                            p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
                            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);

                            DateTime beginTime = DateTime.Now;
                            p.Start();
                            p.BeginErrorReadLine();   // 开始异步读取                         
                            p.WaitForExit();//阻塞等待进程结束
                        }
                        catch (Exception ex)
                        {
                            Common.Common.WriteMsgError("MpegFormatVideo :Process!视频主键:" + item.WetVId + " 详情:" + ex.Message);
                        }
                        finally
                        {
                            p.Close();//关闭进程
                            p.Dispose();//释放资源
                        }

  private static void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            try
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                    Common.WriteMsgError("MpegFormatVideo :p_ErrorDataReceived--信息:" + e.Data);
                }
            }
            catch (Exception ex)
            {
                Common.WriteMsgError("p_ErrorDataReceived!异常:" + ex.Data);
            }
        }

        private static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
              Common.WriteMsg("MpegFormatVideo :视频转换完成!文件:" + e.);
        }

几天或者十几天后就会出现不再转换的情况,没有报错。有p_OutputDataReceived的日志,日志里面正确的和目前不转的日志,ffmpeg的运行轨迹几乎是一样的,但是现在就是不出现mp4文件。

奇怪的是:
1.主程序没有卡死。
2.子线程也依然在运行程序没有出现假死,后续的新视频依然每次都在执行,并且有ffmpeg的执行日志输出。
3.出现问题的时候任务管理器也没有ffmpeg.exe的残留。
4.所有后续的新视频文件就无法正常转换,有执行日志过程,没有生成mp4。
5.重启下主程序,就又好了。
6.windows系统日志也没有任何有关的信息。

哪位兄弟有没有类似的情况,可以帮忙解答。

  • 写回答

1条回答 默认 最新

  • 大为慎独 2022-01-15 12:27
    关注

    1 ffmepg.exe 运行的异常是否会向上抛出给到你的托管代码,如何实现这一步是关系,才能对症下药?
    2 根据你的情况分析,ffmepg.exe 运行过程必定存在了异常,但是没办法捕获到日志记录。try..catch 只能捕捉到托管代码的异常。
    3 可以尝试在运行ffmepg.exe的方法上面加上,捕获非托管代码的修饰符,看看能不能抓取到异常日志。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 1月14日
  • 修改了问题 1月14日
  • 创建了问题 1月14日

悬赏问题

  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error