Example #1
0
        // ReSharper disable once SuggestBaseTypeForParameter
        public static string[] ExtractUsm(FileInfo file)
        {
            var usm   = new CriUsmStream(file.FullName);
            var files = usm.DemultiplexStreams(new MpegStream.DemuxOptionsStruct
            {
                ExtractVideo = true,
                ExtractAudio = true
            });

            return(files);
        }
Example #2
0
        private void Process(string fileName)
        {
            Console.WriteLine($"File: {fileName}");
            var usmStream = new CriUsmStream(fileName);

            Console.WriteLine("Demuxing...");
            usmStream.DemultiplexStreams(new MpegStream.DemuxOptionsStruct()
            {
                AddHeader         = false,
                AddPlaybackHacks  = false,
                ExtractAudio      = true,
                ExtractVideo      = true,
                SplitAudioStreams = false
            });
        }
Example #3
0
        private void Process(string fileName)
        {
            Console.WriteLine($"File: {fileName}");
            var usmStream = new CriUsmStream(fileName);

            Console.WriteLine("Demuxing...");
            usmStream.DemultiplexStreams(new MpegStream.DemuxOptionsStruct()
            {
                AddHeader         = false,
                AddPlaybackHacks  = false,
                ExtractAudio      = true,
                ExtractVideo      = true,
                SplitAudioStreams = false
            });

            if (!string.IsNullOrEmpty(OutputDir) && !Directory.Exists(OutputDir))
            {
                Directory.CreateDirectory(OutputDir);
            }

            JoinOutputFile(usmStream);
        }
Example #4
0
        private void JoinOutputFile(CriUsmStream usmStream)
        {
            if (!File.Exists("config.json"))
            {
                Console.WriteLine("ERROR: config.json not found!");
                return;
            }

            var audioFormat  = usmStream.FinalAudioExtension;
            var pureFileName = Path.GetFileNameWithoutExtension(usmStream.FilePath);

            if (audioFormat == ".adx")
            {
                //ffmpeg can not handle .adx from 0.2 for whatever reason
                //need vgmstream to format that to wav
                if (!Directory.Exists("vgmstream"))
                {
                    Console.WriteLine("ERROR: vgmstream folder not found!");
                    return;
                }

                Console.WriteLine("adx audio detected, convert to wav...");
                Helpers.ExecuteProcess("vgmstream/test.exe", $"\"{Path.ChangeExtension(usmStream.FilePath, usmStream.FinalAudioExtension)}\" -o \"{Path.ChangeExtension(usmStream.FilePath, "wav")}\"");

                usmStream.FinalAudioExtension = ".wav";
            }

            Helpers.ExecuteProcess("ffmpeg", Helpers.CreateFFmpegParameters(usmStream, pureFileName, OutputDir));

            if (CleanTempFiles)
            {
                Console.WriteLine($"Cleaning up temporary files from {pureFileName}");

                File.Delete(Path.ChangeExtension(usmStream.FilePath, "wav"));
                File.Delete(Path.ChangeExtension(usmStream.FilePath, "adx"));
                File.Delete(Path.ChangeExtension(usmStream.FilePath, "hca"));
                File.Delete(Path.ChangeExtension(usmStream.FilePath, "m2v"));
            }
        }
Example #5
0
        public static string CreateFFmpegParameters(CriUsmStream usmStream, string pureFileName, string outputDir)
        {
            JoinConfig conf = JsonConvert.DeserializeObject <JoinConfig>(File.ReadAllText("config.json"));

            StringBuilder sb = new StringBuilder();

            sb.Append($"-i \"{Path.ChangeExtension(usmStream.FilePath, usmStream.FileExtensionVideo)}\" ");

            if (usmStream.HasAudio)
            {
                sb.Append($"-i \"{Path.ChangeExtension(usmStream.FilePath, usmStream.FinalAudioExtension)}\" ");
            }

            sb.Append($"{conf.VideoParameter} ");

            if (usmStream.HasAudio)
            {
                sb.Append($"{conf.AudioParameter} ");
            }

            sb.Append($"\"{Path.Combine(outputDir ?? string.Empty, $"{pureFileName}.{conf.OutputFormat}")}\"");

            return(sb.ToString());
        }
        public static void DecodeUsmFiles(FileInfo filename)
        {
            var  volume       = 1F;
            var  mode         = 16;
            var  loop         = 0;
            var  ciphKey1     = 0x92EBF464;
            uint ciphKey2     = 0x7E896318;
            var  path         = Directory.GetCurrentDirectory();
            var  cridCommands = " -a 92EBF464 -b 7E896318 -v -n \"" +
                                filename.FullName + "\"";

            Console.WriteLine(filename.Name + " - 解密m2v文件...");
            var process = new Process
            {
                StartInfo =
                {
                    FileName        = path + @"\crid.exe",
                    Arguments       = cridCommands,
                    UseShellExecute = true,
                    CreateNoWindow  = true
                }
            };

            process.Start();
            process.WaitForExit();
            var af     = new CriUsmStream(filename.FullName);
            var option = new MpegStream.DemuxOptionsStruct
            {
                ExtractAudio      = true,
                SplitAudioStreams = true
            };

            af.DemultiplexStreams(option);
            foreach (var hcafile in new DirectoryInfo(filename.DirectoryName).GetFiles("*.bin",
                                                                                       SearchOption.AllDirectories))
            {
                if (!hcafile.Name.Contains(filename.Name.Substring(0, filename.Name.Length - 4)))
                {
                    continue;
                }
                using (var inputFileStream = File.Open(hcafile.FullName, FileMode.Open, FileAccess.Read))
                {
                    Console.WriteLine(hcafile.Name + " - 解密hca...");
                    using (var outputFileStream =
                               File.Open(
                                   filename.DirectoryName + @"\" + filename.Name.Substring(0, filename.Name.Length - 4) +
                                   @".demux\" + hcafile.Name.Substring(0, hcafile.Name.Length - 4) + ".wav",
                                   FileMode.Create, FileAccess.Write))
                    {
                        var decodeParams = DecodeParams.CreateDefault();
                        decodeParams.Key1        = ciphKey1;
                        decodeParams.Key2        = ciphKey2;
                        decodeParams.KeyModifier = 0;

                        var audioParams = AudioParams.CreateDefault();

                        audioParams.InfiniteLoop       = AudioParams.Default.InfiniteLoop;
                        audioParams.SimulatedLoopCount = AudioParams.Default.SimulatedLoopCount;
                        audioParams.OutputWaveHeader   = true;

                        using (var hcaStream = new HcaAudioStream(inputFileStream, decodeParams, audioParams))
                        {
                            var read       = 1;
                            var dataBuffer = new byte[1024];

                            while (read > 0)
                            {
                                read = hcaStream.Read(dataBuffer, 0, dataBuffer.Length);

                                if (read > 0)
                                {
                                    outputFileStream.Write(dataBuffer, 0, read);
                                }
                            }
                        }
                    }
                }

                File.Delete(hcafile.FullName);
            }

            var m2vfiles = new DirectoryInfo(filename.DirectoryName + @"\" +
                                             filename.Name.Substring(0, filename.Name.Length - 4) + @".demux\")
                           .GetFiles("*.m2v", SearchOption.AllDirectories);
            var m2vfile  = m2vfiles[0];
            var wavfiles = new DirectoryInfo(filename.DirectoryName + @"\" +
                                             filename.Name.Substring(0, filename.Name.Length - 4) + @".demux\")
                           .GetFiles("*.wav", SearchOption.AllDirectories);
            var wavefile       = wavfiles[0];
            var ffmpegCommands = "-i " + "\"" + m2vfile.FullName + "\"" + " -i " + "\"" + wavefile.FullName + "\"" +
                                 " -c:v copy -c:a aac -strict experimental " + "\"" + filename.DirectoryName + @"\" +
                                 filename.Name.Substring(0, filename.Name.Length - 4) + @".demux\" +
                                 filename.Name.Substring(0, filename.Name.Length - 4) + "_final.mp4" + "\"";

            Console.WriteLine(filename.Name + " - 合并m2v、wav文件...");
            var process2 = new Process
            {
                StartInfo =
                {
                    FileName        = path + @"\ffmpeg.exe",
                    Arguments       = ffmpegCommands,
                    UseShellExecute = true,
                    CreateNoWindow  = true
                }
            };

            process2.Start();
            process2.WaitForExit();
        }
Example #7
0
        protected override void DoTaskForFile(string path, IVgmtWorkerStruct pMpegDemuxStruct, DoWorkEventArgs e)
        {
            MpegDemuxStruct demuxStruct = (MpegDemuxStruct)pMpegDemuxStruct;

            MpegStream.DemuxOptionsStruct demuxOptions = new MpegStream.DemuxOptionsStruct();

            demuxOptions.ExtractAudio = demuxStruct.ExtractAudio;
            demuxOptions.ExtractVideo = demuxStruct.ExtractVideo;

            demuxOptions.AddHeader         = demuxStruct.AddHeader;
            demuxOptions.SplitAudioStreams = demuxStruct.SplitAudioTracks;
            demuxOptions.AddPlaybackHacks  = demuxStruct.AddPlaybackHacks;

            switch (demuxStruct.SourceFormat)
            {
            case "ASF (MS Advanced Systems Format)":
            case "WMV (MS Advanced Systems Format)":
                MicrosoftAsfContainer asfStream = new MicrosoftAsfContainer(path);
                asfStream.DemultiplexStreams(demuxOptions);
                break;

            case "BIK (Bink Video Container)":
                BinkStream binkStream = new BinkStream(path);
                binkStream.DemultiplexStreams(demuxOptions);
                break;

            case "DSI (Racjin/Racdym PS2 Video)":
                RacjinDsiStream dsiStream = new RacjinDsiStream(path);
                dsiStream.DemultiplexStreams(demuxOptions);
                break;

            case "DVD Video (VOB)":
                DvdVideoStream dvdStream = new DvdVideoStream(path);
                dvdStream.DemultiplexStreams(demuxOptions);
                break;

            case "Electronic Arts VP6 (VP6)":
                ElectronicArtsVp6Stream vp6Stream = new ElectronicArtsVp6Stream(path);
                vp6Stream.DemultiplexStreams(demuxOptions);
                break;

            case "Electronic Arts MPC (MPC)":
                ElectronicArtsMpcStream mpcStream = new ElectronicArtsMpcStream(path);
                mpcStream.DemultiplexStreams(demuxOptions);
                break;

            case "H4M (Hudson GameCube Video)":
                HudsonHvqm4VideoStream hvqmStream = new HudsonHvqm4VideoStream(path);
                hvqmStream.DemultiplexStreams(demuxOptions);
                break;

            case "MO (Mobiclip)":
                MobiclipStream.MovieType movieType = MobiclipStream.GetMobiclipStreamType(path);

                switch (movieType)
                {
                //case MobiclipStream.MovieType.NintendoDs:
                //    MobiclipNdsStream mobiclipNdsStream = new MobiclipNdsStream(path);
                //    mobiclipNdsStream.DemultiplexStreams(demuxOptions);
                //    break;
                case MobiclipStream.MovieType.Wii:
                    MobiclipWiiStream mobiclipWiiStream = new MobiclipWiiStream(path);
                    mobiclipWiiStream.DemultiplexStreams(demuxOptions);
                    break;

                default:
                    throw new FormatException(String.Format("Unsupported Mobiclip type, for file: {0}", Path.GetFileName(path)));
                }

                break;

            case "MPEG":
                int mpegType = MpegStream.GetMpegStreamType(path);

                switch (mpegType)
                {
                case 1:
                    Mpeg1Stream mpeg1Stream = new Mpeg1Stream(path);
                    mpeg1Stream.DemultiplexStreams(demuxOptions);
                    break;

                case 2:
                    Mpeg2Stream mpeg2Stream = new Mpeg2Stream(path);
                    mpeg2Stream.DemultiplexStreams(demuxOptions);
                    break;

                default:
                    throw new FormatException(String.Format("Unsupported MPEG type, for file: {0}", Path.GetFileName(path)));
                }
                break;

            case "MPS (PSP UMD Movie)":
                SonyPspMpsStream mpsStream = new SonyPspMpsStream(path);
                mpsStream.DemultiplexStreams(demuxOptions);
                break;

            case "PAM (PlayStation Advanced Movie)":
                SonyPamStream pamStream = new SonyPamStream(path);
                pamStream.DemultiplexStreams(demuxOptions);
                break;

            case "PMF (PSP Movie Format)":
                SonyPmfStream pmfStream = new SonyPmfStream(path);
                pmfStream.DemultiplexStreams(demuxOptions);
                break;

            case "PSS (PlayStation Stream)":
                SonyPssStream sps = new SonyPssStream(path);
                sps.DemultiplexStreams(demuxOptions);
                break;

            case "SFD (CRI Sofdec Video)":
                SofdecStream ss = new SofdecStream(path);
                ss.DemultiplexStreams(demuxOptions);
                break;

            case "THP":
                NintendoThpMovieStream thp = new NintendoThpMovieStream(path);
                thp.DemultiplexStreams(demuxOptions);
                break;

            case "USM (CRI Movie 2)":
                CriUsmStream cus = new CriUsmStream(path);
                cus.DemultiplexStreams(demuxOptions);
                break;

            case "XMV (Xbox Media Video)":
                XmvStream xmv = new XmvStream(path);
                xmv.DemultiplexStreams(demuxOptions);
                break;

            default:
                throw new FormatException("Source format not defined.");
            }

            this.outputBuffer.Append(Path.GetFileName(path) + Environment.NewLine);
        }