C# ffmpeg m3u8 ts 影片拼接mp4

JohnnyLei發表於2024-04-20

準備拼接檔案 裡面放的是需要拼接影片檔案的路徑

concat_list.txt

準備程式碼

        private void CombineFile(string filesDir, string targetmp4fileName)
        {
            string basedir = AppDomain.CurrentDomain.BaseDirectory;
            // ffmpeg的路徑
            string ffmpegPath = @$"{basedir}ffmpeg\bin\ffmpeg.exe";
            // 待合併的MP4檔案列表,使用concat協議的檔名
            string concatListFilePath = @$"{basedir}concat_list.txt";
            // 輸出的MP4檔案
            string outputMp4FilePath = @$"{basedir}{targetmp4fileName}";
            string outputcommandFilePath = @$"{basedir}command.txt";
            var files = Directory.GetFiles(filesDir, "*.ts");
            files = files.OrderBy(f => f).ToArray();
            // 寫入concat協議檔案列表
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(concatListFilePath))
            {
                foreach (var item in files)
                {
                    file.WriteLine(@$"file '{item}'");
                }
                // 繼續新增更多的videoX.mp4
            }

            // 構造FFmpeg命令
            string ffmpegCommand = $"-y -f concat -safe 0 -i  {concatListFilePath} -c copy -map 0 -f mp4  {outputMp4FilePath} ";
            // 寫入ffmpegCommand
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(outputcommandFilePath))
            {
                file.WriteLine(@$" {ffmpegCommand} ");

                // 繼續新增更多的videoX.mp4
            }

            // 使用Process類執行ffmpeg命令
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                FileName = ffmpegPath,
                Arguments = ffmpegCommand,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                CreateNoWindow = true
            };

            using (Process process = new Process { StartInfo = startInfo })
            {
                try
                {
                    process.Start();
                }
                catch (Exception e)
                {
                    Debug.WriteLine($"An error occurred: {e.Message}");
                }
            }
        }

準備ffmpeg

使用

  string localDir = $"{AppDomain.CurrentDomain.BaseDirectory}testvideo\\";
  CombineFile(localDir, "output.mp4");

拼接好的影片

相關文章