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