Пример #1
0
 /// <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);
     }
 }