/// <summary> /// /// </summary> /// <param name="avsFile"></param> /// <param name="destFile"></param> /// <param name="config"></param> /// <param name="e"></param> /// <returns>如果编码顺利完成,返回true;如果被用户中止或在过程中出错,返回false。</returns> private bool EncodeAudio(JobItem jobItem, DoWorkEventArgs e) { try { jobItem.Event = JobEvent.AudioEncoding; jobItem.ProcessAudio(); return(this.ProcessingReport(jobItem, jobItem.AudioEncInfo, e)); } // 有效脚本,但不含音频。注意仅当源文件原本含音频流或输入avs脚本含音频时当前函数可能被调用。 catch (AvisynthAudioStreamNotFoundException) { string err; if (jobItem.UsingExternalAudio && jobItem.ExternalAudio.Length > 0) { err = jobItem.ExternalAudio; } else { err = jobItem.SourceFile; } if (jobItem.VideoInfo.Container == "avs") { // 输入音频脚本被改为不含音频的有效的脚本(视频脚本) err += "\n音频编码失败,原因是输入avs脚本有错误。"; } else { // 由于对于非avs脚本的媒体文件采用内部编写音频脚本的方式,如果出错则该脚本必然无效,因此不会出现以下错误 err += "\n音频编码失败"; } MessageBox.Show(err, "检测失败", MessageBoxButtons.OK, MessageBoxIcon.Error); this.SetJobEventAndReportProgress(jobItem, JobEvent.Error); return(false); } catch (AviSynthException exception) { string err; if (jobItem.UsingExternalAudio && jobItem.ExternalAudio.Length > 0) { err = jobItem.ExternalAudio + "\n"; } else { 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也可以在转换设置中改用FFAudioSource源滤镜,则不需要安装相关的DirectShow解码器。"; } else { err += "音频编码失败。请尝试更改音频源滤镜。"; } MessageBox.Show(err, "编码失败", MessageBoxButtons.OK, MessageBoxIcon.Error); this.SetJobEventAndReportProgress(jobItem, JobEvent.Error); return(false); } catch (Exception exception) { string err; if (jobItem.UsingExternalAudio && jobItem.ExternalAudio.Length > 0) { err = jobItem.ExternalAudio; } else { err = jobItem.SourceFile; } MessageBox.Show(err + "\n音频编码失败。" + exception.ToString()); this.SetJobEventAndReportProgress(jobItem, JobEvent.Error); return(false); } }