private void StartOneThread() { int isHandling = -1; while (true) { int thisstate = -1; ListViewItem item = null; FileConfig fileConfig = null; try { lock (handledlock) { if (isHandling >= listView2.Items.Count - 1) { return; } hasHandle++; if (hasHandle > listView2.Items.Count - 1) { return; } isHandling = hasHandle; this.Invoke((Action) delegate() { item = listView2.Items[isHandling]; fileConfig = item.Tag as FileConfig; if (fileConfig.state != -1) { thisstate = -10; } item.SubItems["States"].Text = "视频转码中"; fileConfig.state++; }); if (thisstate == -10) { continue; } this.Invoke((Action) delegate() { if (fileConfig.InputType == InputType.AvisynthScriptFile || fileConfig.InputType == InputType.AvisynthScript) { EncoderTaskInfoForm form = new EncoderTaskInfoForm(); form.fileConfig = fileConfig; form.lbFile.Text = fileConfig.FullName; form.Text = fileConfig.FullName; fileConfig.EncoderTaskInfo.infoForm = form; form.Show(); } }); } string outputfile = ""; string copyto = string.Empty; string ralative = string.Empty; //仅输出视频部分 if (!Directory.Exists(fileConfig.OutputPath)) { Directory.CreateDirectory(fileConfig.OutputPath); } if (fileConfig.KeepDirection) {//保持目录树结构 ralative = FileUtility.MakeRelativePath(fileConfig.DirPath + "/", Path.GetDirectoryName(fileConfig.FullName)); string outpath = Path.Combine(fileConfig.OutputPath, ralative); if (!Directory.Exists(outpath)) { Directory.CreateDirectory(outpath); } outputfile = Path.Combine(outpath, Path.GetFileNameWithoutExtension(fileConfig.FullName)); } else if (fileConfig.OutputPath != "") {//有输出目录 outputfile = Path.Combine(fileConfig.OutputPath, Path.GetFileNameWithoutExtension(fileConfig.FullName)); } else {//输出原路径 outputfile = Path.Combine(Path.GetDirectoryName(fileConfig.FullName), Path.GetFileNameWithoutExtension(fileConfig.FullName)); } if (fileConfig.CompleteDo && !string.IsNullOrEmpty(fileConfig.CompleteActionDir)) { if (fileConfig.KeepDirection) {//保持目录树结构 copyto = Path.Combine(fileConfig.CompleteActionDir, ralative, Path.GetFileNameWithoutExtension(fileConfig.FullName)); } else { copyto = Path.Combine(fileConfig.CompleteActionDir, Path.GetFileNameWithoutExtension(fileConfig.FullName)); } } else { fileConfig.CompleteDo = false; } fileConfig.OutputFile = outputfile; VedioConfig vedioconfig = fileConfig.VedioConfig; string vedioOutputFile = string.Empty; //vedioOutputFile = "D:\\temp\\" + Path.GetFileNameWithoutExtension(fileConfig.VedioFileFullName) + ".h265"; try { if (vedioconfig.Encoder == Encoder.x264) { if (fileConfig.InputType == InputType.Vedio) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); vedioOutputFile = X264Command.RunX264Command(fileConfig); } else if (fileConfig.InputType == InputType.AvisynthScriptFile) { vedioOutputFile = X264Command.RunAvsx264mod(fileConfig); } else if (fileConfig.InputType == InputType.AvisynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Path.GetTempPath(), Path.ChangeExtension(Path.GetRandomFileName(), ".avs")); File.WriteAllText(avsfilename, vedioconfig.AvsScript, System.Text.Encoding.Default); fileConfig.AvsFileFullName = avsfilename; fileConfig.InputType = InputType.AvisynthScriptFile; vedioOutputFile = X264Command.RunAvsx264mod(fileConfig); } else if (fileConfig.InputType == InputType.VapoursynthScriptFile) { vedioOutputFile = X264Command.RunVSx265(fileConfig); } else if (fileConfig.InputType == InputType.VapoursynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Config.Temp, Path.ChangeExtension(Path.GetRandomFileName(), ".vpy")); File.WriteAllText(avsfilename, vedioconfig.VapoursynthScript, System.Text.Encoding.UTF8); fileConfig.VapoursynthFileFullName = avsfilename; fileConfig.InputType = InputType.VapoursynthScriptFile; vedioOutputFile = X264Command.RunVSx265(fileConfig); } } else if (vedioconfig.Encoder == Encoder.x265) { if (fileConfig.InputType == InputType.Vedio) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr) { fileConfig.VedioConfig.decoderMode = DecoderMode.pipe; } if (fileConfig.VedioConfig.decoderMode == DecoderMode.pipe) { vedioOutputFile = X265Command.ffmpegPipeX265(fileConfig); } else { vedioOutputFile = X265Command.RunX265Command(fileConfig); } } else if (fileConfig.InputType == InputType.AvisynthScriptFile) { vedioOutputFile = X265Command.RunAvsx264mod(fileConfig); } else if (fileConfig.InputType == InputType.AvisynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Config.Temp, Path.ChangeExtension(Path.GetRandomFileName(), ".avs")); File.WriteAllText(avsfilename, vedioconfig.AvsScript, System.Text.Encoding.Default); fileConfig.AvsFileFullName = avsfilename; fileConfig.InputType = InputType.AvisynthScriptFile; vedioOutputFile = X265Command.RunAvsx264mod(fileConfig); } else if (fileConfig.InputType == InputType.VapoursynthScriptFile) { vedioOutputFile = X265Command.RunVSx265(fileConfig); } else if (fileConfig.InputType == InputType.VapoursynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Config.Temp, Path.ChangeExtension(Path.GetRandomFileName(), ".vpy")); File.WriteAllText(avsfilename, vedioconfig.VapoursynthScript, System.Text.Encoding.UTF8); fileConfig.VapoursynthFileFullName = avsfilename; fileConfig.InputType = InputType.VapoursynthScriptFile; vedioOutputFile = X265Command.RunVSx265(fileConfig); } } else if (vedioconfig.Encoder == Encoder.NvEnc_H265 || vedioconfig.Encoder == Encoder.NvEnc_H264) { if (fileConfig.InputType == InputType.Vedio) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr) { fileConfig.VedioConfig.decoderMode = DecoderMode.self; } if (fileConfig.VedioConfig.decoderMode == DecoderMode.self) { vedioOutputFile = NvEncCommand.NvEncSelf(fileConfig); } else { vedioOutputFile = NvEncCommand.ffmpegPipeNvEnc(fileConfig); } } else if (fileConfig.InputType == InputType.VapoursynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Config.Temp, Path.ChangeExtension(Path.GetRandomFileName(), ".vpy")); File.WriteAllText(avsfilename, vedioconfig.VapoursynthScript, System.Text.Encoding.UTF8); fileConfig.VapoursynthFileFullName = avsfilename; fileConfig.InputType = InputType.VapoursynthScriptFile; if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr) { fileConfig.VedioConfig.decoderMode = DecoderMode.self; } if (fileConfig.VedioConfig.decoderMode == DecoderMode.self) { vedioOutputFile = NvEncCommand.NvEncUseVs(fileConfig); } else { vedioOutputFile = NvEncCommand.VspipeNvEnc(fileConfig); } } else if (fileConfig.InputType == InputType.AvisynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Config.Temp, Path.ChangeExtension(Path.GetRandomFileName(), ".avs")); File.WriteAllText(avsfilename, vedioconfig.AvsScript, System.Text.Encoding.Default); fileConfig.AvsFileFullName = avsfilename; fileConfig.InputType = InputType.AvisynthScriptFile; vedioOutputFile = NvEncCommand.NvEncUseVs(fileConfig); } else if (fileConfig.InputType == InputType.VapoursynthScriptFile) { if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr) { fileConfig.VedioConfig.decoderMode = DecoderMode.self; } if (fileConfig.VedioConfig.decoderMode == DecoderMode.self) { vedioOutputFile = NvEncCommand.NvEncUseVs(fileConfig); } else { vedioOutputFile = NvEncCommand.VspipeNvEnc(fileConfig); } } else if (fileConfig.InputType == InputType.AvisynthScriptFile) { vedioOutputFile = NvEncCommand.NvEncUseVs(fileConfig); } } else if (vedioconfig.Encoder == Encoder.QSVEnc_H265 || vedioconfig.Encoder == Encoder.QSVEnc_H264) { if (fileConfig.InputType == InputType.Vedio) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr) { fileConfig.VedioConfig.decoderMode = DecoderMode.self; } if (fileConfig.VedioConfig.decoderMode == DecoderMode.self) { vedioOutputFile = QSVEncCommand.QSVEncSelf(fileConfig); } else { vedioOutputFile = QSVEncCommand.ffmpegPipeQSVEnc(fileConfig); } } else if (fileConfig.InputType == InputType.VapoursynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Config.Temp, Path.ChangeExtension(Path.GetRandomFileName(), ".vpy")); File.WriteAllText(avsfilename, vedioconfig.VapoursynthScript, System.Text.Encoding.UTF8); fileConfig.VapoursynthFileFullName = avsfilename; fileConfig.InputType = InputType.VapoursynthScriptFile; if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr) { fileConfig.VedioConfig.decoderMode = DecoderMode.self; } if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr || fileConfig.VedioConfig.decoderMode == DecoderMode.self) { vedioOutputFile = QSVEncCommand.QSVEncUseVs(fileConfig); } else { vedioOutputFile = QSVEncCommand.VspipeQSVEnc(fileConfig); } } else if (fileConfig.InputType == InputType.AvisynthScript) { fileConfig.mediaInfo = new MediaInfo(fileConfig.FullName); string avsfilename = Path.Combine(Config.Temp, Path.ChangeExtension(Path.GetRandomFileName(), ".avs")); File.WriteAllText(avsfilename, vedioconfig.AvsScript, System.Text.Encoding.Default); fileConfig.AvsFileFullName = avsfilename; fileConfig.InputType = InputType.AvisynthScriptFile; vedioOutputFile = QSVEncCommand.QSVEncUseVs(fileConfig); } else if (fileConfig.InputType == InputType.VapoursynthScriptFile) { if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr) { fileConfig.VedioConfig.decoderMode = DecoderMode.self; } if (fileConfig.VedioConfig.decoderMode == DecoderMode.defaultStr || fileConfig.VedioConfig.decoderMode == DecoderMode.self) { vedioOutputFile = QSVEncCommand.QSVEncUseVs(fileConfig); } else { vedioOutputFile = QSVEncCommand.VspipeQSVEnc(fileConfig); } } else if (fileConfig.InputType == InputType.AvisynthScriptFile) { vedioOutputFile = QSVEncCommand.QSVEncUseVs(fileConfig); } } } catch (EncoderException e) { this.Invoke((Action) delegate() { item.SubItems["States"].Text = e.Message; }); fileConfig.state = -10; continue; } if (!File.Exists(vedioOutputFile)) { this.Invoke((Action) delegate() { item.SubItems["States"].Text = "视频编码失败"; }); fileConfig.state = -10; continue; } int delay = 0; string audiofile = string.Empty; if (fileConfig.AudioConfig.Enabled && fileConfig.state != -10) { //if (fileConfig.InputType == InputType.Vedio && fileConfig.AudioConfig.CopyStream && fileConfig.VedioConfig.Encoder == Encoder.x264) //{ // //直接由x264处理掉 //} //else { if (isHandling >= listView2.Items.Count) { return; } this.Invoke((Action) delegate() { item = listView2.Items[isHandling]; item.SubItems["States"].Text = "音频转码中"; }); if (!fileConfig.AudioConfig.Enabled) { } else if (fileConfig.AudioConfig.CopyStream) { audiofile = CommandHelper.DemuxAudio(fileConfig); } else { if (fileConfig.AudioConfig.UseEac3to) { if (fileConfig.AudioConfig.Encoder == AudioEncoder.aac) { audiofile = Eac3toCommand.ConvertMusic(fileConfig); } else if (fileConfig.AudioConfig.Encoder == AudioEncoder.opus) { audiofile = Eac3toCommand.ConvertAudioTOpus(fileConfig); } else if (fileConfig.AudioConfig.Encoder == AudioEncoder.flac) { audiofile = Eac3toCommand.ConvertAudioToFlac(fileConfig); } } else { if (fileConfig.AudioConfig.Encoder == AudioEncoder.aac) { audiofile = CommandHelper.RunFFmpegToAAC(fileConfig); } else if (fileConfig.AudioConfig.Encoder == AudioEncoder.opus) { audiofile = CommandHelper.RunFFmpegToOpus(fileConfig); } else if (fileConfig.AudioConfig.Encoder == AudioEncoder.flac) { audiofile = FFmpegCommand.RunFFmpegToFlac(fileConfig); } } } if (isHandling >= listView2.Items.Count) { return; } this.Invoke((Action) delegate() { item.SubItems["States"].Text = "封装中"; }); if (fileConfig.mediaInfo != null) { delay = fileConfig.mediaInfo.DelayRelativeToVideo; //delay = delay - 67; } } } if (fileConfig.state != -10) { if (fileConfig.Muxer == "mkv") { vedioOutputFile = CommandHelper.MKVmergin(fileConfig, vedioOutputFile, audiofile, delay); } else if (fileConfig.Muxer == "mp4") { vedioOutputFile = CommandHelper.mp4box(fileConfig, vedioOutputFile, audiofile, delay); } else if (fileConfig.Muxer == "flv") { vedioOutputFile = CommandHelper.ffmpegmux(fileConfig, vedioOutputFile, audiofile, fileConfig.Muxer); if (fileConfig.sinablack) { FlvMain flvbugger = new FlvMain(); flvbugger.addFile(vedioOutputFile); flvbugger.ExecuteBlack(999d, -1, Path.ChangeExtension(vedioOutputFile, ".black.flv")); } else if (fileConfig.sinaPreblack) { FlvMain flvbugger = new FlvMain(); flvbugger.addFile(vedioOutputFile); flvbugger.ExecuteTime(999d, -1, Path.ChangeExtension(vedioOutputFile, ".speed.flv")); } } } if (fileConfig.CompleteDo && fileConfig.state != -10) { try { copyto = copyto + Path.GetExtension(vedioOutputFile); copyto = FileUtility.GetNoSameNameFile(copyto); if (fileConfig.CompleteAction == "拷贝到") { this.Invoke((Action) delegate() { item.SubItems["States"].Text = "拷贝中"; }); File.Copy(vedioOutputFile, copyto, true); } else if (fileConfig.CompleteAction == "剪切到") { this.Invoke((Action) delegate() { item.SubItems["States"].Text = "剪切中"; }); File.Move(vedioOutputFile, copyto); } } catch { } } this.Invoke((Action) delegate() { if (fileConfig.state == -10) { item.SubItems["States"].Text = "失败"; } else { item.SubItems["States"].Text = "完成"; } }); } catch (Exception ex) { this.Invoke((Action) delegate() { item.SubItems["States"].Text = "失败:" + ex.Message; }); } } }
public static string ffmpegPipeX265(FileConfig fileConfig) { VedioConfig vedioConfig = fileConfig.VedioConfig; ProcessStartInfo processinfo = new ProcessStartInfo(); string finalX265Path = ""; if (vedioConfig.depth == 8) { finalX265Path = x265Excute8lite; } else if (vedioConfig.depth == 10) { finalX265Path = x265Excute10lite; } if (!File.Exists(finalX265Path)) { throw new EncoderException("找不到指定程序:" + finalX265Path); } processinfo.FileName = Environment.GetEnvironmentVariable("ComSpec"); string x264Line; string outputpath = ""; Getx265Line(fileConfig, 1, out x264Line, out outputpath); string ffmpegline = TextManager.Mh + FFmpegCommand.FFmpegExecute + TextManager.Mh + FFmpegCommand.GetFfmpegArgs(fileConfig); var bat = ffmpegline + finalX265Path + " " + x264Line + " -"; //processinfo.UseShellExecute = false; //输出信息重定向 //processinfo.CreateNoWindow = true; //processinfo.RedirectStandardInput = true; //processinfo.RedirectStandardOutput = true; //processinfo.RedirectStandardError = false; //processinfo.WindowStyle = ProcessWindowStyle.Hidden; Process avsx264mod = new Process(); if (vedioConfig.BitType == EncoderBitrateType.crf) { ProcessCmd.RunBat(bat, Config.Temp); } else if (vedioConfig.BitType == EncoderBitrateType.twopass) { Getx265Line(fileConfig, 1, out x264Line, out outputpath); var bat1 = ffmpegline + finalX265Path + " " + x264Line + " -"; ProcessCmd.RunBat(bat1, Config.Temp); Getx265Line(fileConfig, 2, out x264Line, out outputpath); var bat2 = ffmpegline + finalX265Path + " " + x264Line + " -"; ProcessCmd.RunBat(bat2, Config.Temp); } avsx264mod.Dispose(); return(outputpath); }
public static string ffmpegPipeX265(FileConfig fileConfig) { VedioConfig vedioConfig = fileConfig.VedioConfig; ProcessStartInfo processinfo = new ProcessStartInfo(); string finalX265Path = ""; finalX265Path = GetX265LiteFullName(vedioConfig); if (Config.IsWindows) { finalX265Path = Path.Combine(Application.StartupPath, finalX265Path); } string x264Line; string outputpath = ""; Getx265Line(fileConfig, 1, out x264Line, out outputpath); string ffmpegline = Path.Combine(Application.StartupPath, FFmpegCommand.FFmpegExecute).Maohao() + FFmpegCommand.GetFfmpegArgs(fileConfig); var bat = ffmpegline + finalX265Path.Maohao() + " " + x264Line; //bat += "\r\npause"; //processinfo.UseShellExecute = false; //输出信息重定向 //processinfo.CreateNoWindow = true; //processinfo.RedirectStandardInput = true; //processinfo.RedirectStandardOutput = true; //processinfo.RedirectStandardError = false; //processinfo.WindowStyle = ProcessWindowStyle.Hidden; Process avsx264mod = new Process(); if (vedioConfig.BitType == EncoderBitrateType.crf) { ProcessCmd.RunBat(bat, Config.Temp); } else if (vedioConfig.BitType == EncoderBitrateType.twopass) { Getx265Line(fileConfig, 1, out x264Line, out outputpath); var bat1 = ffmpegline + finalX265Path + " " + x264Line + " -"; ProcessCmd.RunBat(bat1, Config.Temp); Getx265Line(fileConfig, 2, out x264Line, out outputpath); var bat2 = ffmpegline + finalX265Path + " " + x264Line + " -"; ProcessCmd.RunBat(bat2, Config.Temp); } avsx264mod.Dispose(); return(outputpath); }