diff --git a/FileFlows.Common.dll b/FileFlows.Common.dll index 13328f97..5a309702 100644 Binary files a/FileFlows.Common.dll and b/FileFlows.Common.dll differ diff --git a/FileFlows.Common.pdb b/FileFlows.Common.pdb index fc8238fc..a78acf2a 100644 Binary files a/FileFlows.Common.pdb and b/FileFlows.Common.pdb differ diff --git a/FileFlows.Plugin.dll b/FileFlows.Plugin.dll index a95ed038..e88af816 100644 Binary files a/FileFlows.Plugin.dll and b/FileFlows.Plugin.dll differ diff --git a/FileFlows.Plugin.pdb b/FileFlows.Plugin.pdb index ae662871..3331808a 100644 Binary files a/FileFlows.Plugin.pdb and b/FileFlows.Plugin.pdb differ diff --git a/FileFlowsPlugins.sln.DotSettings.user b/FileFlowsPlugins.sln.DotSettings.user index 51d45496..42a86ac4 100644 --- a/FileFlowsPlugins.sln.DotSettings.user +++ b/FileFlowsPlugins.sln.DotSettings.user @@ -1,4 +1,5 @@  + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioLanguageConverter.cs b/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioLanguageConverter.cs new file mode 100644 index 00000000..acd4f38b --- /dev/null +++ b/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioLanguageConverter.cs @@ -0,0 +1,292 @@ +using FileFlows.VideoNodes.FfmpegBuilderNodes.Models; + +namespace FileFlows.VideoNodes.FfmpegBuilderNodes; + +/// +/// Converts/adds audio tracks based on a language +/// +public class FfmpegBuilderAudioLanguageConverter : FfmpegBuilderNode +{ + /// + public override string HelpUrl => "https://fileflows.com/docs/plugins/video-nodes/ffmpeg-builder/audio-language-converter"; + /// + public override string Icon => "fas fa-comment-dot"; + /// + public override int Outputs => 2; + + /// + /// Gets or sets the languages to create audio tracks for + /// + [Languages(1)] + [Required] + public string[] Languages { get; set; } + + /// + /// Gets or sets the codec to use + /// + [DefaultValue("aac")] + [Select(nameof(CodecOptions), 2)] + public string Codec { get; set; } + + /// + /// The available codec options + /// + private static List _CodecOptions; + /// + /// Gets the available codec options + /// + public static List CodecOptions + { + get + { + if (_CodecOptions == null) + { + _CodecOptions = new List + { + new () { Label = "AAC", Value = "aac"}, + new () { Label = "AC3", Value = "ac3"}, + new () { Label = "DTS", Value = "dts" }, + new () { Label = "FLAC", Value ="flac" }, + new () { Label = "OPUS", Value = "opus"} + }; + } + return _CodecOptions; + } + } + + /// + /// Gets or sets the number of channels for the converted audio + /// + [DefaultValue(0)] + [Select(nameof(ChannelsOptions), 3)] + public float Channels { get; set; } + /// + /// The channel options + /// + private static List _ChannelsOptions; + /// + /// Gets the channel options + /// + public static List ChannelsOptions + { + get + { + if (_ChannelsOptions == null) + { + _ChannelsOptions = new List + { + new () { Label = "Same as source", Value = 0}, + new () { Label = "Stereo", Value = 2f}, + new () { Label = "5.1", Value = 6}, + new () { Label = "7.1", Value = 8} + }; + } + return _ChannelsOptions; + } + } + /// + /// Gets or sets the bitrate + /// + [Select(nameof(BitrateOptions), 4)] + public int Bitrate { get; set; } + + private static List _BitrateOptions; + /// + /// Gets the background bitrate options + /// + public static List BitrateOptions + { + get + { + if (_BitrateOptions == null) + { + _BitrateOptions = new List + { + new() { Label = "Automatic", Value = 0}, + new() { Label = "Same as source", Value = 1} + }; + for (int i = 64; i <= 2048; i += 32) + { + _BitrateOptions.Add(new ListOption { Label = i + " Kbps", Value = i }); + } + } + return _BitrateOptions; + } + } + + /// + /// Gets or sets if the other audio tracks should be removed + /// + [Boolean(5)] + public bool RemoveOthers { get; set; } + + /// + public override int Execute(NodeParameters args) + { + List newAudioStreams = []; + // ensure theres no duplicates, e.g. if OriginalLanguage is english and english is also specified + var languages = Languages.Select(x => + { + var comparison = x.Replace("{", "").Replace("}", ""); + if (string.Equals("original", comparison, StringComparison.InvariantCultureIgnoreCase) || + string.Equals("orig", comparison, StringComparison.InvariantCultureIgnoreCase) || + string.Equals("originallanguage", comparison, StringComparison.InvariantCultureIgnoreCase)) + { + if (Variables.TryGetValue("OriginalLanguage", out var oLang) == false || + oLang is string oLangStr == false || string.IsNullOrEmpty(oLangStr)) + return null; + return LanguageHelper.GetIso2Code(oLangStr); + } + return x; + }).Where(x => x != null).Distinct().ToList(); + + foreach (var lang in languages) + { + var newAudio = GetNewAudioStream(args, lang); + if (newAudio == null) + { + args.Logger?.WLog($"Failed to find language '{lang}'"); + continue; + } + + newAudioStreams.Add(newAudio); + } + + if (newAudioStreams.Count == 0) + { + args.Logger?.ILog("Failed to locate any matching languages to create audio tracks for"); + return 2; + } + + if (RemoveOthers) + { + foreach (var audioStream in Model.AudioStreams) + { + audioStream.Deleted = true; + } + } + + Model.AudioStreams.AddRange(newAudioStreams); + + args.Logger?.ILog($"Created {newAudioStreams.Count} new audio streams"); + return 1; + + } + + /// + /// Gets the new audio stream for the specified language, or null if failed to locate matching stream + /// + /// the node parameters + /// the language to add + /// the new stream or null if not found + private FfmpegAudioStream? GetNewAudioStream(NodeParameters args, string language) + { + var sourceAudio = GetBestAudioTrack(args, Model.AudioStreams.Select(x => x.Stream), language); + if (sourceAudio == null) + return null; + + args.Logger?.ILog($"Using audio track for language '{language}': {sourceAudio}"); + + var audio = new FfmpegAudioStream(); + audio.Stream = sourceAudio; + audio.Channels = audio.Stream.Channels; + + bool directCopy = false; + if(string.Equals(sourceAudio.Codec, this.Codec, StringComparison.CurrentCultureIgnoreCase)) + { + if((Channels == 0 || Math.Abs(Channels - sourceAudio.Channels) < 0.05f) && Bitrate <= 2) + { + directCopy = true; + } + } + + if (directCopy) + { + audio.Codec = sourceAudio.Codec; + args.Logger?.ILog($"Source audio is already in appropriate format, just copying that track: {sourceAudio.IndexString}, Channels: {sourceAudio.Channels}, Codec: {sourceAudio.Codec}"); + } + else + { + audio.Codec = Codec; + + int totalChannels = FfmpegBuilderAudioAddTrack.GetAudioBitrateChannels(args.Logger, Channels < 1 ? audio.Channels : Channels, Codec); + int channels = Channels < 1 ? 0 : totalChannels; + + int bitrate = totalChannels * Bitrate; + args.Logger?.ILog("Total channels: " + totalChannels); + args.Logger?.ILog("Bitrate Per Channel: " + bitrate); + + args.Logger?.ILog("Total Bitrate: " + bitrate); + + audio.EncodingParameters.AddRange(FfmpegBuilderAudioAddTrack.GetNewAudioTrackParameters(args, audio, Codec, channels, bitrate, 0)); + if (channels > 0) + { + args.Logger?.ILog("Setting channels to: " + channels); + audio.Channels = channels; + } + } + + audio.Title = LanguageHelper.GetEnglishFor(language) + (Channels switch + { + < 1.9f => " (Mono)", + < 2.1f => " (Stereo)", + < 3f => " (2.1)", + < 5.3f => " (5.1)", + < 7.3f => " (7.1)", + _ => $" ({Math.Round(Channels, 1)})" + }); + + return audio; + } + + + /// + /// Gets the best audio track + /// + /// the node parameters + /// the possible audio streams + /// the best stream + internal AudioStream GetBestAudioTrack(NodeParameters args, IEnumerable streams, string language) + { + var bestAudio = streams + // only search tracks of the same language + .Where(x => LanguageHelper.Matches(args, language, x.Language)) + // only get a track that has more or equal number of channels + .Where(x => Math.Abs(x.Channels - this.Channels) < 0.1f || x.Channels >= this.Channels) + // remove any commentary tracks + .Where(x => System.Text.Json.JsonSerializer.Serialize(x).ToLower().Contains("comment") == false) + .OrderBy(x => + { + if (Math.Abs(this.Channels - 2) < 0.05f) + { + if (Math.Abs(x.Channels - 2) < 0.05f) + return 1_000_000_000; + // compare codecs + if (x.Codec?.ToLower() == this.Codec?.ToLower()) + return 1_000_000; + } + + if (Math.Abs(this.Channels - 1) < 0.05f) + { + if (Math.Abs(x.Channels - 1) < 0.05f) + return 1_000_000_000; + if (x.Channels <= 2.1f) + return 5_000_000; + if (x.Codec?.ToLower() == this.Codec?.ToLower()) + return 1_000_000; + } + + // now we want best channels, but to prefer matching codec + if (x.Codec?.ToLower() == this.Codec?.ToLower()) + { + return 1_000 + x.Channels; + } + + return x.Channels; + }) + .ThenBy(x => x.Index) + .FirstOrDefault(); + return bestAudio; + } + +} \ No newline at end of file diff --git a/VideoNodes/i18n/de.json b/VideoNodes/i18n/de.json index 9464bb86..f59bec89 100644 --- a/VideoNodes/i18n/de.json +++ b/VideoNodes/i18n/de.json @@ -235,6 +235,26 @@ "2": "Keine zu konvertierenden Spuren" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Fügt neue Audiospuren für die angegebenen Sprachen im gewünschten Format, mit Bitrate und Kanalkonfiguration hinzu. Wenn eine passende Spur bereits im korrekten Format existiert, wird sie kopiert, anstatt neu kodiert zu werden. Optional können andere Audiospuren entfernt werden.", + "Label": "FFMPEG Builder: Audio-Sprachkonverter", + "Fields": { + "Bitrate": "Bitrate", + "Bitrate-Help": "Die Zielbitrate für die neu hinzugefügten Audiospuren. Wählen Sie einen Wert, der eine Balance zwischen Audioqualität und Dateigröße bietet.", + "Channels": "Kanäle", + "Channels-Help": "Die Anzahl der Kanäle für die neuen Audiospuren. Wenn Sie weniger Kanäle als die Quelle angeben, mischt FFMPEG das Audio automatisch herunter, um die gewünschte Kanalanzahl zu erreichen.", + "Codec": "Codec", + "Codec-Help": "Der Codec, der zur Kodierung der neuen Audiospuren verwendet werden soll.", + "Languages": "Sprachen", + "Languages-Help": "Die Liste der Sprachen, für die neue Audiospuren hinzugefügt werden sollen.", + "RemoveOthers": "Andere entfernen", + "RemoveOthers-Help": "Entfernt alle anderen Audiospuren und lässt nur die hier erstellten übrig. Wenn keine Spuren hinzugefügt werden können, bleibt die ursprüngliche Konfiguration unverändert." + }, + "Outputs": { + "1": "Audiospuren wurden zum FFmpeg-Modell hinzugefügt", + "2": "Es wurden keine Audiospuren hinzugefügt" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normalisiert alle Audiospuren in einer Videodatei mit FFMPEGs loudnorm-Filter.", "Label": "FFMPEG Builder: Audio-Normalisierung", diff --git a/VideoNodes/i18n/en.json b/VideoNodes/i18n/en.json index d497f76d..85cd2229 100644 --- a/VideoNodes/i18n/en.json +++ b/VideoNodes/i18n/en.json @@ -235,6 +235,26 @@ "2": "No tracks to be converted" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Adds new audio tracks for the specified languages in the desired format, bitrate, and channel configuration. If a matching track already exists in the correct format, it will be copied instead of re-encoded. Optionally, other audio tracks can be removed.", + "Label": "FFMPEG Builder: Audio Language Converter", + "Fields": { + "Bitrate": "Bitrate", + "Bitrate-Help": "The target bitrate for the newly added audio tracks. Choose a value that provides a balance between audio quality and file size.", + "Channels": "Channels", + "Channels-Help": "The number of channels for the new audio tracks. If you specify fewer channels than the source, FFMPEG will automatically downmix the audio to match the desired channel count.", + "Codec": "Codec", + "Codec-Help": "The codec to use when encoding the new audio tracks.", + "Languages": "Languages", + "Languages-Help": "The list of languages for which new audio tracks should be added.", + "RemoveOthers": "Remove Others", + "RemoveOthers-Help": "Removes all other audio tracks, leaving only the ones created here. If no tracks can be added, the operation will not run, and the original tracks will remain untouched." + }, + "Outputs": { + "1": "Audio tracks added to FFmpeg model", + "2": "No audio tracks were added" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normalizes all audio tracks in a video file using FFMPEGs loudnorm filter", "Label": "FFMPEG Builder: Audio Normalization", diff --git a/VideoNodes/i18n/es.json b/VideoNodes/i18n/es.json index db24d4d8..0514a784 100644 --- a/VideoNodes/i18n/es.json +++ b/VideoNodes/i18n/es.json @@ -235,6 +235,26 @@ "2": "No hay pistas para ser convertidas" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Agrega nuevas pistas de audio para los idiomas especificados en el formato, tasa de bits y configuración de canales deseados. Si ya existe una pista coincidente en el formato correcto, se copiará en lugar de volver a codificarse. Opcionalmente, se pueden eliminar otras pistas de audio.", + "Label": "FFMPEG Builder: Convertidor de idioma de audio", + "Fields": { + "Bitrate": "Tasa de bits", + "Bitrate-Help": "La tasa de bits objetivo para las nuevas pistas de audio. Elige un valor que equilibre la calidad del audio y el tamaño del archivo.", + "Channels": "Canales", + "Channels-Help": "El número de canales para las nuevas pistas de audio. Si especificas menos canales que la fuente, FFMPEG mezclará el audio automáticamente para coincidir con la cantidad de canales deseada.", + "Codec": "Códec", + "Codec-Help": "El códec que se utilizará para codificar las nuevas pistas de audio.", + "Languages": "Idiomas", + "Languages-Help": "La lista de idiomas para los que se deben agregar nuevas pistas de audio.", + "RemoveOthers": "Eliminar otros", + "RemoveOthers-Help": "Elimina todas las demás pistas de audio, dejando solo las creadas aquí. Si no se pueden agregar pistas, la configuración original permanecerá intacta." + }, + "Outputs": { + "1": "Pistas de audio añadidas al modelo de FFmpeg", + "2": "No se añadieron pistas de audio" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normaliza todas las pistas de audio en un archivo de video usando el filtro loudnorm de FFMPEG", "Label": "FFMPEG Builder: Normalización de Audio", diff --git a/VideoNodes/i18n/fr.json b/VideoNodes/i18n/fr.json index 2297a7ef..bc96d2d0 100644 --- a/VideoNodes/i18n/fr.json +++ b/VideoNodes/i18n/fr.json @@ -235,6 +235,26 @@ "2": "Aucune piste à convertir" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Ajoute de nouvelles pistes audio pour les langues spécifiées dans le format, le débit et la configuration des canaux souhaités. Si une piste correspondante existe déjà au bon format, elle sera copiée au lieu d'être réencodée. Les autres pistes audio peuvent être supprimées en option.", + "Label": "FFMPEG Builder : Convertisseur de langue audio", + "Fields": { + "Bitrate": "Débit", + "Bitrate-Help": "Le débit cible pour les nouvelles pistes audio. Choisissez une valeur qui équilibre la qualité audio et la taille du fichier.", + "Channels": "Canaux", + "Channels-Help": "Le nombre de canaux pour les nouvelles pistes audio. Si vous spécifiez moins de canaux que la source, FFMPEG réduira automatiquement le mixage audio pour correspondre au nombre de canaux souhaité.", + "Codec": "Codec", + "Codec-Help": "Le codec à utiliser pour encoder les nouvelles pistes audio.", + "Languages": "Langues", + "Languages-Help": "La liste des langues pour lesquelles de nouvelles pistes audio doivent être ajoutées.", + "RemoveOthers": "Supprimer les autres", + "RemoveOthers-Help": "Supprime toutes les autres pistes audio, ne laissant que celles créées ici. Si aucune piste ne peut être ajoutée, la configuration d'origine restera inchangée." + }, + "Outputs": { + "1": "Pistes audio ajoutées au modèle FFmpeg", + "2": "Aucune piste audio n'a été ajoutée" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normalise toutes les pistes audio d'un fichier vidéo à l'aide du filtre loudnorm de FFMPEG", "Label": "FFMPEG Builder: Normalisation Audio", diff --git a/VideoNodes/i18n/it.json b/VideoNodes/i18n/it.json index f116a554..89244f3b 100644 --- a/VideoNodes/i18n/it.json +++ b/VideoNodes/i18n/it.json @@ -235,6 +235,26 @@ "2": "Nessuna traccia da convertire" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Aggiunge nuove tracce audio per le lingue specificate nel formato, bitrate e configurazione dei canali desiderati. Se una traccia corrispondente è già nel formato corretto, verrà copiata invece di essere ricodificata. Facoltativamente, è possibile rimuovere altre tracce audio.", + "Label": "FFMPEG Builder: Convertitore lingua audio", + "Fields": { + "Bitrate": "Bitrate", + "Bitrate-Help": "Il bitrate target per le nuove tracce audio. Scegli un valore che equilibri qualità audio e dimensione del file.", + "Channels": "Canali", + "Channels-Help": "Il numero di canali per le nuove tracce audio. Se specifichi meno canali rispetto alla sorgente, FFMPEG effettuerà automaticamente un downmix per adattarsi al numero di canali desiderato.", + "Codec": "Codec", + "Codec-Help": "Il codec da utilizzare per codificare le nuove tracce audio.", + "Languages": "Lingue", + "Languages-Help": "L'elenco delle lingue per le quali aggiungere nuove tracce audio.", + "RemoveOthers": "Rimuovi altri", + "RemoveOthers-Help": "Rimuove tutte le altre tracce audio lasciando solo quelle create qui. Se non è possibile aggiungere tracce, la configurazione originale rimarrà invariata." + }, + "Outputs": { + "1": "Tracce audio aggiunte al modello FFmpeg", + "2": "Nessuna traccia audio aggiunta" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normalizza tutte le tracce audio in un file video utilizzando il filtro loudnorm di FFMPEG", "Label": "FFMPEG Builder: Normalizzazione Audio", diff --git a/VideoNodes/i18n/ja.json b/VideoNodes/i18n/ja.json index 6ddf0e19..4aa72cd1 100644 --- a/VideoNodes/i18n/ja.json +++ b/VideoNodes/i18n/ja.json @@ -235,6 +235,26 @@ "2": "変換するトラックはありません" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "指定された言語の新しいオーディオトラックを、希望の形式、ビットレート、チャンネル構成で追加します。一致するトラックが既に正しい形式で存在する場合、それをコピーし、再エンコードは行いません。他のオーディオトラックをオプションで削除できます。", + "Label": "FFMPEG Builder: オーディオ言語コンバーター", + "Fields": { + "Bitrate": "ビットレート", + "Bitrate-Help": "新しく追加されるオーディオトラックの目標ビットレート。音質とファイルサイズのバランスが取れる値を選んでください。", + "Channels": "チャンネル", + "Channels-Help": "新しいオーディオトラックのチャンネル数。ソースより少ないチャンネル数を指定すると、FFMPEGが自動的にダウンミックスして希望のチャンネル数に調整します。", + "Codec": "コーデック", + "Codec-Help": "新しいオーディオトラックをエンコードする際に使用するコーデック。", + "Languages": "言語", + "Languages-Help": "新しいオーディオトラックを追加する対象の言語リスト。", + "RemoveOthers": "その他を削除", + "RemoveOthers-Help": "他のオーディオトラックをすべて削除し、ここで作成されたもののみを残します。トラックを追加できない場合、元の設定は変更されません。" + }, + "Outputs": { + "1": "FFmpegモデルにオーディオトラックを追加しました", + "2": "オーディオトラックは追加されませんでした" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "FFMPEGのloudnormフィルターを使用して、ビデオファイル内のすべての音声トラックを正規化します。", "Label": "FFMPEG Builder: 音声正規化", diff --git a/VideoNodes/i18n/ko.json b/VideoNodes/i18n/ko.json index 261e8de1..dde28f66 100644 --- a/VideoNodes/i18n/ko.json +++ b/VideoNodes/i18n/ko.json @@ -235,6 +235,26 @@ "2": "변환할 트랙이 없습니다." } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "지정된 언어의 새 오디오 트랙을 원하는 형식, 비트레이트 및 채널 구성으로 추가합니다. 올바른 형식으로 일치하는 트랙이 이미 있는 경우 복사되며 다시 인코딩되지 않습니다. 선택적으로 다른 오디오 트랙을 제거할 수 있습니다.", + "Label": "FFMPEG Builder: 오디오 언어 변환기", + "Fields": { + "Bitrate": "비트레이트", + "Bitrate-Help": "새로 추가되는 오디오 트랙의 목표 비트레이트입니다. 음질과 파일 크기의 균형을 유지할 수 있는 값을 선택하세요.", + "Channels": "채널", + "Channels-Help": "새 오디오 트랙의 채널 수입니다. 소스보다 적은 채널 수를 지정하면, FFMPEG가 자동으로 오디오를 다운믹스하여 원하는 채널 수에 맞춥니다.", + "Codec": "코덱", + "Codec-Help": "새 오디오 트랙을 인코딩할 때 사용할 코덱입니다.", + "Languages": "언어", + "Languages-Help": "새 오디오 트랙을 추가할 언어 목록입니다.", + "RemoveOthers": "기타 제거", + "RemoveOthers-Help": "다른 오디오 트랙을 모두 제거하고, 여기에서 생성된 트랙만 남깁니다. 추가할 수 있는 트랙이 없으면 원래 구성이 변경되지 않습니다." + }, + "Outputs": { + "1": "FFmpeg 모델에 오디오 트랙이 추가되었습니다.", + "2": "추가된 오디오 트랙이 없습니다." + } + }, "FfmpegBuilderAudioNormalization": { "Description": "FFMPEG의 loudnorm 필터를 사용하여 비디오 파일의 모든 오디오 트랙을 정규화합니다.", "Label": "FFMPEG 빌더: 오디오 정규화", diff --git a/VideoNodes/i18n/nl.json b/VideoNodes/i18n/nl.json index 91a734b6..152bb84b 100644 --- a/VideoNodes/i18n/nl.json +++ b/VideoNodes/i18n/nl.json @@ -235,6 +235,26 @@ "2": "Geen tracks om te converteren" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Voegt nieuwe audiotracks toe voor de opgegeven talen in het gewenste formaat, met bitrate en kanaalconfiguratie. Als er al een bijpassende track in het juiste formaat bestaat, wordt deze gekopieerd in plaats van opnieuw gecodeerd. Optioneel kunnen andere audiotracks worden verwijderd.", + "Label": "FFMPEG Builder: Audio Taal Converter", + "Fields": { + "Bitrate": "Bitrate", + "Bitrate-Help": "De doelbitrate voor de nieuwe audiotracks. Kies een waarde die balans biedt tussen geluidskwaliteit en bestandsgrootte.", + "Channels": "Kanalen", + "Channels-Help": "Het aantal kanalen voor de nieuwe audiotracks. Als u minder kanalen dan de bron specificeert, zal FFMPEG het geluid automatisch dowmixen naar het gewenste aantal kanalen.", + "Codec": "Codec", + "Codec-Help": "De codec die wordt gebruikt voor het coderen van de nieuwe audiotracks.", + "Languages": "Talen", + "Languages-Help": "De lijst met talen waarvoor nieuwe audiotracks moeten worden toegevoegd.", + "RemoveOthers": "Andere verwijderen", + "RemoveOthers-Help": "Verwijdert alle andere audiotracks en laat alleen de hier gemaakte over. Als er geen tracks kunnen worden toegevoegd, blijft de originele configuratie ongewijzigd." + }, + "Outputs": { + "1": "Audiotracks toegevoegd aan het FFmpeg-model.", + "2": "Er zijn geen audiotracks toegevoegd." + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normaliseert alle audiotracks in een videobestand met behulp van FFMPEG's loudnorm-filter", "Label": "FFMPEG Builder: Audio Normalisatie", diff --git a/VideoNodes/i18n/pt.json b/VideoNodes/i18n/pt.json index 2eae2e9b..4269ba4f 100644 --- a/VideoNodes/i18n/pt.json +++ b/VideoNodes/i18n/pt.json @@ -235,6 +235,26 @@ "2": "Nenhuma faixa a ser convertida" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Adiciona novas faixas de áudio para os idiomas especificados no formato desejado, com taxa de bits e configuração de canais. Se uma faixa correspondente já existir no formato correto, será copiada em vez de reencodificada. Opcionalmente, outras faixas de áudio podem ser removidas.", + "Label": "FFMPEG Builder: Conversor de Idiomas de Áudio", + "Fields": { + "Bitrate": "Taxa de Bits", + "Bitrate-Help": "A taxa de bits desejada para as novas faixas de áudio. Escolha um valor que equilibre qualidade de áudio e tamanho do arquivo.", + "Channels": "Canais", + "Channels-Help": "O número de canais para as novas faixas de áudio. Caso especifique menos canais que a fonte, o FFMPEG fará automaticamente o downmix do áudio para o número desejado de canais.", + "Codec": "Codec", + "Codec-Help": "O codec a ser usado para codificar as novas faixas de áudio.", + "Languages": "Idiomas", + "Languages-Help": "A lista de idiomas para os quais novas faixas de áudio devem ser adicionadas.", + "RemoveOthers": "Remover Outros", + "RemoveOthers-Help": "Remove todas as outras faixas de áudio, deixando apenas as criadas aqui. Caso não seja possível adicionar faixas, a configuração original permanecerá inalterada." + }, + "Outputs": { + "1": "Faixas de áudio adicionadas ao modelo FFmpeg.", + "2": "Nenhuma faixa de áudio foi adicionada." + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normaliza todas as faixas de áudio de um arquivo de vídeo usando o filtro loudnorm do FFMPEG", "Label": "FFMPEG Builder: Normalização de Áudio", diff --git a/VideoNodes/i18n/ru.json b/VideoNodes/i18n/ru.json index e81c7862..1b58bd74 100644 --- a/VideoNodes/i18n/ru.json +++ b/VideoNodes/i18n/ru.json @@ -235,6 +235,26 @@ "2": "Нет треков для конвертации" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Добавляет новые аудиодорожки для указанных языков в требуемом формате, с битрейтом и настройкой каналов. Если уже существует подходящая дорожка в правильном формате, она будет скопирована, а не перекодирована. При необходимости можно удалить другие аудиодорожки.", + "Label": "FFMPEG Builder: Конвертер аудиоязыков", + "Fields": { + "Bitrate": "Битрейт", + "Bitrate-Help": "Целевой битрейт для новых аудиодорожек. Выберите значение, которое обеспечит баланс между качеством звука и размером файла.", + "Channels": "Каналы", + "Channels-Help": "Количество каналов для новых аудиодорожек. Если указано меньше каналов, чем в исходнике, FFMPEG автоматически уменьшит количество каналов.", + "Codec": "Кодек", + "Codec-Help": "Кодек, который будет использоваться для кодирования новых аудиодорожек.", + "Languages": "Языки", + "Languages-Help": "Список языков, для которых необходимо добавить новые аудиодорожки.", + "RemoveOthers": "Удалить другие", + "RemoveOthers-Help": "Удаляет все другие аудиодорожки, оставляя только созданные. Если новые дорожки невозможно добавить, исходная конфигурация останется неизменной." + }, + "Outputs": { + "1": "Аудиодорожки добавлены в модель FFmpeg.", + "2": "Аудиодорожки не были добавлены." + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Нормализует все аудиотреки в видеофайле с помощью фильтра loudnorm FFMPEG", "Label": "FFMPEG Builder: Нормализация аудио", diff --git a/VideoNodes/i18n/sv.json b/VideoNodes/i18n/sv.json index 9f7fead1..569726a4 100644 --- a/VideoNodes/i18n/sv.json +++ b/VideoNodes/i18n/sv.json @@ -235,6 +235,26 @@ "2": "Inga spår att konvertera" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "Lägger till nya ljudspår för de specificerade språken i önskat format, med bithastighet och kanalinställning. Om ett matchande spår redan finns i rätt format, kopieras det istället för att omkodas. Alternativt kan andra ljudspår tas bort.", + "Label": "FFMPEG Builder: Ljudspråksomvandlare", + "Fields": { + "Bitrate": "Bithastighet", + "Bitrate-Help": "Den målsatta bithastigheten för de nya ljudspåren. Välj ett värde som balanserar ljudkvalitet och filstorlek.", + "Channels": "Kanaler", + "Channels-Help": "Antalet kanaler för de nya ljudspåren. Om färre kanaler anges än källan, kommer FFMPEG automatiskt att mixa ned ljudet till önskat antal kanaler.", + "Codec": "Codec", + "Codec-Help": "Den codec som ska användas för att koda de nya ljudspåren.", + "Languages": "Språk", + "Languages-Help": "Listan över språk som nya ljudspår ska läggas till för.", + "RemoveOthers": "Ta bort andra", + "RemoveOthers-Help": "Tar bort alla andra ljudspår och lämnar endast de som skapats här. Om inga spår kan läggas till, förblir originalkonfigurationen oförändrad." + }, + "Outputs": { + "1": "Ljudspår har lagts till i FFmpeg-modellen.", + "2": "Inga ljudspår har lagts till." + } + }, "FfmpegBuilderAudioNormalization": { "Description": "Normaliserar alla ljudspår i en videofil med FFMPEG:s loudnorm-filter", "Label": "FFMPEG Builder: Ljudnormalisering", diff --git a/VideoNodes/i18n/zh.json b/VideoNodes/i18n/zh.json index 174997da..7f490753 100644 --- a/VideoNodes/i18n/zh.json +++ b/VideoNodes/i18n/zh.json @@ -235,6 +235,26 @@ "2": "没有轨道待转换" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "为指定语言添加新的音轨,使用所需格式、比特率和声道配置。如果已有匹配的音轨且格式正确,则直接复制而不是重新编码。可选地,可以删除其他音轨。", + "Label": "FFMPEG Builder:音频语言转换器", + "Fields": { + "Bitrate": "比特率", + "Bitrate-Help": "新音轨的目标比特率。选择一个平衡音质和文件大小的值。", + "Channels": "声道", + "Channels-Help": "新音轨的声道数量。如果指定的声道少于来源,FFMPEG 将自动混音以匹配所需声道数量。", + "Codec": "编码器", + "Codec-Help": "用于编码新音轨的编码器。", + "Languages": "语言", + "Languages-Help": "需要添加新音轨的语言列表。", + "RemoveOthers": "删除其他", + "RemoveOthers-Help": "删除所有其他音轨,仅保留此处创建的音轨。如果无法添加音轨,原始配置将保持不变。" + }, + "Outputs": { + "1": "音轨已添加到 FFmpeg 模型。", + "2": "未添加任何音轨。" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "使用FFMPEG的loudnorm过滤器规范化视频文件中的所有音轨", "Label": "FFMPEG构建器:音频规范化", diff --git a/VideoNodes/i18n/zht.json b/VideoNodes/i18n/zht.json index 7b68f16b..d11a69ec 100644 --- a/VideoNodes/i18n/zht.json +++ b/VideoNodes/i18n/zht.json @@ -235,6 +235,26 @@ "2": "沒有待轉換的音軌" } }, + "FfmpegBuilderAudioLanguageConverter": { + "Description": "為指定語言新增音軌,使用所需的格式、比特率和聲道配置。如果已經存在符合條件的音軌且格式正確,則會直接複製而不重新編碼。可以選擇性地移除其他音軌。", + "Label": "FFMPEG Builder:音頻語言轉換器", + "Fields": { + "Bitrate": "比特率", + "Bitrate-Help": "新音軌的目標比特率。請選擇一個在音質與檔案大小之間取得平衡的值。", + "Channels": "聲道", + "Channels-Help": "新音軌的聲道數量。如果指定的聲道數少於來源,FFMPEG 將自動混音以符合所需的聲道數。", + "Codec": "編碼器", + "Codec-Help": "用於編碼新音軌的編碼器。", + "Languages": "語言", + "Languages-Help": "需要新增音軌的語言清單。", + "RemoveOthers": "移除其他", + "RemoveOthers-Help": "移除所有其他音軌,僅保留此處新增的音軌。如果無法新增音軌,原始配置將保持不變。" + }, + "Outputs": { + "1": "已將音軌新增至 FFmpeg 模型。", + "2": "未新增任何音軌。" + } + }, "FfmpegBuilderAudioNormalization": { "Description": "使用 FFMPEG 的 loudnorm 過濾器標準化視頻文件中的所有音頻音軌", "Label": "FFMPEG Builder:音頻標準化",