Ejemplo n.º 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 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);
     }
 }