From 55d71d632842a22e8d595e1e6a91553e63a4ea23 Mon Sep 17 00:00:00 2001 From: N00MKRAD Date: Wed, 24 Feb 2021 09:59:18 +0100 Subject: [PATCH] Output streams: Support missing stream files, skip instead of erroring If for some reason an audio or sub track failed to extract, it will now simply ommit it in the output file instead of failing to mux the video entirely. --- Code/Data/AudioTrack.cs | 4 ++-- Code/Data/SubtitleTrack.cs | 4 ++-- Code/Media/FfmpegAudioAndMetadata.cs | 30 +++++++++++++++------------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Code/Data/AudioTrack.cs b/Code/Data/AudioTrack.cs index 356d2a8..e31fef9 100644 --- a/Code/Data/AudioTrack.cs +++ b/Code/Data/AudioTrack.cs @@ -11,8 +11,8 @@ namespace Flowframes.Data public AudioTrack(int streamNum, string titleStr, string codecStr) { streamIndex = streamNum; - title = titleStr.Trim().Replace(" ", "."); - codec = codecStr.Trim(); + title = titleStr.Trim().Replace("_", ".").Replace(" ", "."); + codec = codecStr.Trim().Replace("_", "."); } } } diff --git a/Code/Data/SubtitleTrack.cs b/Code/Data/SubtitleTrack.cs index f91f90d..7c31828 100644 --- a/Code/Data/SubtitleTrack.cs +++ b/Code/Data/SubtitleTrack.cs @@ -12,8 +12,8 @@ namespace Flowframes.Data public SubtitleTrack(int streamNum, string langStr, string encodingStr) { streamIndex = streamNum; - lang = langStr.Trim().Replace(" ", "."); - langFriendly = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(langStr.ToLower().Trim().Replace(" ", ".")); + lang = langStr.Trim().Replace("_", ".").Replace(" ", "."); + langFriendly = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(langStr.ToLower().Trim().Replace("_", ".").Replace(" ", ".")); encoding = encodingStr.Trim(); } } diff --git a/Code/Media/FfmpegAudioAndMetadata.cs b/Code/Media/FfmpegAudioAndMetadata.cs index 079679f..04a1be4 100644 --- a/Code/Media/FfmpegAudioAndMetadata.cs +++ b/Code/Media/FfmpegAudioAndMetadata.cs @@ -16,8 +16,13 @@ namespace Flowframes.Media { partial class FfmpegAudioAndMetadata : FfmpegCommands { - public static async Task ExtractAudioTracks(string inputFile, string outFolder) + #region Audio + + public static async Task ExtractAudioTracks(string inputFile, string outFolder, bool showMsg = true) { + string msg = "Extracting audio from video..."; + if (showMsg) Logger.Log(msg); + List audioTracks = await GetAudioTracks(inputFile); int counter = 1; @@ -79,6 +84,8 @@ namespace Flowframes.Media return audioTracks; } + #endregion + #region Subtitles public static async Task ExtractSubtitles(string inputFile, string outFolder, Interpolate.OutMode outMode,bool showMsg = true) @@ -147,7 +154,7 @@ namespace Flowframes.Media #endregion - public static async Task MergeAudioAndSubs(string inputFile, string tempFolder, int looptimes = -1) // https://superuser.com/a/277667 + public static async Task MergeAudioAndSubs(string inputFile, string tempFolder) // https://superuser.com/a/277667 { // Logger.Log($"[FFCmds] Merging audio from {audioPath} into {inputFile}", true); string containerExt = Path.GetExtension(inputFile); @@ -155,7 +162,6 @@ namespace Flowframes.Media string outPath = Path.Combine(tempFolder, $"muxed{containerExt}"); File.Move(inputFile, tempPath); string inName = Path.GetFileName(tempPath); - // string audioName = Path.GetFileName(audioPath); string outName = Path.GetFileName(outPath); string[] audioTracks = IOUtils.GetFilesSorted(tempFolder, false, "*_audio.*"); // Find audio files @@ -176,23 +182,20 @@ namespace Flowframes.Media string trackMapArgs = ""; string trackMetaArgs = ""; - // for (int subTrack = 0; subTrack < subTracks.Length; subTrack++) - // { - // trackInputArgs += $" -i {Path.GetFileName(subTracks[subTrack])}"; // Input filename - // trackMapArgs += $" -map {Path.GetFileNameWithoutExtension(subTracks[subTrack]).Split('_')[0].GetInt()}"; // Stream index - // trackMetaArgs += $" -metadata:s:s:{subTrack} language={Path.GetFileNameWithoutExtension(subTracks[subTrack]).Split('_')[1]}"; // Language - // } - SortedDictionary sortedTrackFiles = new SortedDictionary(trackFiles); + int inputIndex = 1; // Input index (= output stream index) - Start at 1 since 0 is the video stream + foreach (KeyValuePair track in sortedTrackFiles) { int streamIndex = track.Key; string trackFile = track.Value; trackInputArgs += $" -i {Path.GetFileName(trackFile)}"; // Input filename - trackMapArgs += $" -map {Path.GetFileNameWithoutExtension(trackFile).Split('_')[0].GetInt()}"; // Set stream index - trackMetaArgs += $" -metadata:s:{streamIndex} title={Path.GetFileNameWithoutExtension(trackFile).Split('_')[1]}"; // Language or title + trackMapArgs += $" -map {inputIndex}"; // Map input file + trackMetaArgs += $" -metadata:s:{inputIndex} title={Path.GetFileNameWithoutExtension(trackFile).Split('_')[1]}"; // Language or title + + inputIndex++; } bool allAudioCodecsSupported = true; @@ -207,8 +210,7 @@ namespace Flowframes.Media string subArgs = "-c:s " + Utils.GetSubCodecForContainer(containerExt); string audioArgs = allAudioCodecsSupported ? "-c:a copy" : Utils.GetAudioFallbackArgs(Path.GetExtension(inputFile)); - string args = $" -i {inName} -stream_loop {looptimes}" + - $"{trackInputArgs} -map 0:v {trackMapArgs} -c:v copy {audioArgs} {subArgs} {trackMetaArgs} -shortest {outName}"; + string args = $" -i {inName} {trackInputArgs} -map 0:v {trackMapArgs} -c:v copy {audioArgs} {subArgs} {trackMetaArgs} -shortest {outName}"; await RunFfmpeg(args, tempFolder, LogMode.Hidden);