/// <summary> /// /// </summary> /// <param name="avsFile"></param> /// <param name="destFile"></param> /// <param name="config"></param> /// <param name="e"></param> /// <returns>如果编码顺利完成,返回true;如果被用户中止或在过程中出错,返回false。</returns> private bool EncodeVideo(JobItem jobItem, DoWorkEventArgs e) { try { jobItem.Event = JobEvent.VideoEncoding; jobItem.ProcessVideo(); return(this.ProcessingReport(jobItem, jobItem.VideoEncInfo, e)); } catch (BadEncoderCmdException) { MessageBox.Show("视频编码失败。是否使用了不正确的命令行?", "编码失败", MessageBoxButtons.OK, MessageBoxIcon.Error); this.SetJobEventAndReportProgress(jobItem, JobEvent.Error); return(false); } // 有效脚本,但不含视频。注意仅当源文件原本含视频流或输入avs脚本含视频时当前函数可能被调用。 catch (AvisynthVideoStreamNotFoundException) { string err = jobItem.SourceFile + "\n"; if (jobItem.VideoInfo.Container == "avs") { // 输入视频脚本被改为不含视频的有效的脚本(音频脚本) err += "视频编码失败,原因是输入avs脚本有错误。"; } else { // 由于对于非avs脚本的媒体文件采用内部编写视频脚本的方式,如果出错则该脚本必然无效,因此不会出现以下错误 err += "视频编码失败。"; } MessageBox.Show(err, "编码失败", MessageBoxButtons.OK, MessageBoxIcon.Error); this.SetJobEventAndReportProgress(jobItem, JobEvent.Error); return(false); } // 无效脚本。注意仅当源文件原本含视频流或输入avs脚本含视频时本函数可能被调用。 catch (AviSynthException exception) { string err = jobItem.SourceFile + "\n"; // 输入avs脚本被更改为无效的avs脚本 if (jobItem.VideoInfo.Container == "avs") { err += "视频编码失败,原因是输入avs脚本有错误。\n\n" + exception.ToString(); } // 对于非avs脚本的媒体文件,可能虽然源文件含视频流,但无对应DShow滤镜而使avs脚本无效;或源文件被更改为非媒体文件 else if (jobItem.AvsConfig.VideoSourceFilter == VideoSourceFilter.DirectShowSource || jobItem.AvsConfig.VideoSourceFilter == VideoSourceFilter.DSS2) { err += "视频编码失败。\n"; if (jobItem.VideoInfo.Format.Length > 0) { err += "\n视频格式:" + jobItem.VideoInfo.Format; } if (jobItem.AudioInfo.Format.Length > 0) { err += "\n音频格式:" + jobItem.AudioInfo.Format; } if (jobItem.VideoInfo.Container.Length > 0) { err += "\n容器:" + jobItem.VideoInfo.Container; } err += "\n可能是没有为该视频安装正确的DirectShow解码器或分离器。\n可以尝试安装解码包,或ffdshow解码器和Haali分离器等。\n也可以在转换设置中改用FFVideoSource源滤镜,则不需要安装相关的DirectShow解码器。"; } else { err += "视频编码失败。请尝试更改视频源滤镜。"; } MessageBox.Show(err, "编码失败", MessageBoxButtons.OK, MessageBoxIcon.Error); this.SetJobEventAndReportProgress(jobItem, JobEvent.Error); return(false); } catch (Exception exception) { MessageBox.Show(jobItem.SourceFile + "\n视频编码失败。" + exception.ToString()); this.SetJobEventAndReportProgress(jobItem, JobEvent.Error); return(false); } }