using Halo.Core.Delivery; using Halo.Core.Library; namespace Halo.Media.Tests; /// Die ffmpeg-Zeile, betrachtet ohne sie auszuführen. public class RemuxArgumentsTests { private static ProbedStream Bild() => new(0, MediaStreamKind.Video, "h264", null, null, true, false, null, 1920, 1080); private static ProbedStream Ton(int i, string codec = "aac", int kanäle = 6) => new(i, MediaStreamKind.Audio, codec, "deu", null, false, false, kanäle, null, null); private static ProbedStream Text(int i, string codec = "subrip") => new(i, MediaStreamKind.Subtitle, codec, "deu", null, false, false, null, null, null); private static List Bauen(IReadOnlyList spuren, string schachtel = "mkv") { var plan = DeliveryDecider.ForDownload(schachtel, spuren); return RemuxArguments.For(new RemuxRequest("/medien/film.mkv", "/kratz/film.mp4", spuren, plan)); } private static string AlsZeile(List argumente) => string.Join(' ', argumente); /// Jede Spur wird einzeln benannt — und zwar alle. [Test] public void Alle_Spuren_werden_abgebildet() { var zeile = AlsZeile(Bauen([Bild(), Ton(1), Ton(2), Text(3)])); Assert.That(zeile, Does.Contain("-map 0:0")); Assert.That(zeile, Does.Contain("-map 0:1")); Assert.That(zeile, Does.Contain("-map 0:2")); Assert.That(zeile, Does.Contain("-map 0:3")); } [Test] public void Bild_und_Ton_werden_kopiert_nicht_gerechnet() { var zeile = AlsZeile(Bauen([Bild(), Ton(1), Ton(2)])); Assert.That(zeile, Does.Contain("-c copy")); Assert.That(zeile, Does.Not.Contain("-c:a:"), "Nichts davon muss neu gerechnet werden"); Assert.That(zeile, Does.Not.Contain("libx264"), "Das Bild wird nie angefasst"); } [Test] public void Textuntertitel_werden_nach_tx3g_umgeschrieben() { Assert.That(AlsZeile(Bauen([Bild(), Ton(1), Text(2)])), Does.Contain("-c:s mov_text")); } [Test] public void Ohne_Untertitel_steht_auch_keine_Untertitel_Anweisung_da() { Assert.That(AlsZeile(Bauen([Bild(), Ton(1)])), Does.Not.Contain("-c:s")); } [Test] public void Bilduntertitel_werden_gar_nicht_erst_abgebildet() { var zeile = AlsZeile(Bauen([Bild(), Ton(1), Text(2, "hdmv_pgs_subtitle"), Text(3, "subrip")])); Assert.That(zeile, Does.Not.Contain("-map 0:2"), "PGS passt in keine MP4"); Assert.That(zeile, Does.Contain("-map 0:3")); } /// Die Verwechslung, vor der der Kommentar an MediaStream.Index warnt. /// /// /// -c:a:1 meint die zweite Tonspur der Ausgabe, nicht die Spur /// Nummer 1 der Datei. Hier steht DTS an Dateinummer 2 und ist die /// zweite Tonspur — also -c:a:1. Wer die Dateinummer einsetzte, /// träfe eine andere Spur oder gar keine. /// [Test] public void Neu_gerechnet_wird_nach_der_Nummer_der_Ausgabe() { var zeile = AlsZeile(Bauen([Bild(), Ton(1, "aac"), Ton(2, "dts"), Ton(3, "aac")])); Assert.That(zeile, Does.Contain("-c:a:1 aac")); Assert.That(zeile, Does.Not.Contain("-c:a:0"), "Die erste Tonspur passt schon"); Assert.That(zeile, Does.Not.Contain("-c:a:2"), "Die dritte auch"); } /// Fällt ein Untertitel weg, verschieben sich die Tonnummern nicht. /// /// /// Tonspuren werden unter sich gezählt — ein weggelassener Untertitel /// ändert daran nichts. Die Prüfung steht hier, weil der umgekehrte Fehler /// naheliegt und erst an einer stummen Spur auffiele. /// [Test] public void Ein_weggelassener_Untertitel_verschiebt_die_Tonnummern_nicht() { var zeile = AlsZeile(Bauen([Bild(), Text(1, "hdmv_pgs_subtitle"), Ton(2, "aac"), Ton(3, "dts")])); Assert.That(zeile, Does.Contain("-c:a:1 aac")); } [Test] public void Mehr_Kanaele_bekommen_mehr_Bitrate() { Assert.That(AlsZeile(Bauen([Bild(), Ton(1, "dts", kanäle: 2)])), Does.Contain("-b:a:0 192000")); Assert.That(AlsZeile(Bauen([Bild(), Ton(1, "dts", kanäle: 6)])), Does.Contain("-b:a:0 576000")); Assert.That(AlsZeile(Bauen([Bild(), Ton(1, "dts", kanäle: 8)])), Does.Contain("-b:a:0 640000"), "Gedeckelt — acht Kanäle bekämen sonst mehr, als irgendein Gerät braucht"); } [Test] public void Das_Inhaltsverzeichnis_wandert_nach_vorn() { Assert.That(AlsZeile(Bauen([Bild(), Ton(1)])), Does.Contain("-movflags +faststart")); } [Test] public void Quelle_und_Ziel_stehen_an_der_richtigen_Stelle() { var argumente = Bauen([Bild(), Ton(1)]); Assert.That(argumente[argumente.IndexOf("-i") + 1], Is.EqualTo("/medien/film.mkv")); Assert.That(argumente[^1], Is.EqualTo("/kratz/film.mp4"), "Das Ziel steht bei ffmpeg immer zuletzt"); } }