Wir haben eine Anwendung entwickelt, um Quell-MOV-Dateien in .ogg-, .mp4- und .webm-Ausgaben zu transkodieren. Es wird derzeit auf der AWS EC2-Instanz g2.8xlarge ausgeführt. Es funktioniert (yay!).

Meine Frage: Obwohl ich -threads 0 an den Befehl ffmpeg übergebe (tatsächlich Konfiguration in php-ffmpeg ) wird der laufende Prozess manchmal nur auf einem einzelnen Kern ausgeführt. Warum passiert dies? Siehe unten Ausgabe des Befehls htop:

htop-Ausgabe

Wie Sie sehen können , Core # 21 ist voll. In ein paar Sekunden wird zu einem anderen gewechselt, anstatt alle zu maximieren, wie ich es möchte, und meinen Codierungsprozess erheblich zu beschleunigen. Die Situation ist vorübergehend, während einiger Läufe sind alle Prozessoren maximal, aber bei anderen ist dies nicht der Fall und wir verwenden nur einen Prozessor. Ein Kollege erwähnte, dass der Codec, den wir für einige der Formate verwenden, möglicherweise die Multithread-Ausführung während der Codierung nicht unterstützt. obwohl ich nicht überprüfen kann, ob dies das Verhalten ist, das ich noch beobachte.

Ist dies der Fall? Wenn ja, welche Codecs für die oben genannten Formate ermöglichen es uns, in diese Zielformate zu transkodieren, während wir dies ausnutzen Alle unsere verfügbaren Hardware? Die für php-ffmpeg festgelegten Standardcodecs sind unten aufgeführt:

 Video Audio Ogg libtheora libvorbis WebM libvpx libvorbis X264 libx264 libfaac 

Update

Wenn Sie sich die laufenden Prozesse ansehen, sehen Sie unten den Befehl ffmpeg, der für einen MP4 ausgeführt wird (der derzeit alle 32 Kerne sättigt):

Ich erstelle diesen Befehl nicht direkt, php-ffmpeg ist es, obwohl ich glaube, dass ich zumindest eine bescheidene Kontrolle darüber habe, was geht (zum Beispiel habe ich keine Ahnung, warum es am Anfang mehrere -metadata:s:v:0 -Einträge gibt)

Kommentare

  • Es gibt ‚ eine Menge Yuck-Faktor in dieser Befehlszeile, abgesehen von den duplizierten Optionen (-s dreimal , der letzte mit einer anderen Größe). Explizites Festlegen einer Reihe von Argumenten auf ihre aktuellen Standardwerte (z. B. -i_qfactor, -subq, -qcomp) ist seltsam und könnte mit der zukünftigen libx264 zu schlechten Ergebnissen führen. (Wahrscheinlich nicht, aber nur, weil libx264 ziemlich fertig und stabil ist und sich nicht in einer starken Entwicklung befindet. Wenn es so etwas für x265 machen würde, wäre das schlecht.) Wie auch immer, 1200k mit 2 Durchgängen ist in Ordnung, aber Sie könnten das Ziel bevorzugen -Qualität crf. ‚ gibt kein -preset an. 🙁
  • libfaac ist nicht ‚ nicht so gut wie libfdk_aac Wenn Sie ‚ dies in einem kostenpflichtigen Dienst verwenden, müssen Sie ‚ jedoch die Lizenzierung von libfdk_aac überprüfen. Außerdem fehlt diese cmdline. -movflags +faststart
  • ‚ Es ist auch möglich, dass ffmpeg mehrere Ausgaben derselben erzeugt Eingabe. Nur mehrere Sequenzen von Ausgabeoptionen Ausgabedateiname in der Befehlszeile. Alles in allem bin ich ‚ von php-ffmpeg nicht besonders beeindruckt, wenn das ‚ ist die Art von cmdline, mit der es geliefert wird. Vielleicht könnten Sie es anders verwenden, um mehrere Ausgaben gleichzeitig zu generieren, sodass ‚ t nicht vorhanden wäre Sei ein Single-Threaded-Theora-Schritt. Wie auch immer, wenn es funktioniert, dann großartig, aber hüte dich vor Änderungen an den Encoder-Standardeinstellungen und der Bedeutung der x264 subme -Ebenen, die sich auf eine Weise ändern, wie ich und Ihre cmdline schadet der Qualität.
  • @Peter vielen Dank. Ich denke, die Antwort hier ist wirklich, dass ich debuggen muss, wie dieses cmd erstellt wird. Wenn ich wirklich mehrere Ausgaben in diesen Befehl einfügen kann, würde mir dies wahrscheinlich die bessere Möglichkeit geben, die Belastung der Hardware zu maximieren.
  • trac.ffmpeg .org / wiki /% 20multiple% 20outputs erstellen . Und ja, ich stimme zu, dass ‚ wahrscheinlich am besten ist. Andernfalls haben Sie die Aufgabe, dass ‚ für einige Zeit Single-Threaded ist und alle Ihre Kerne für einen anderen Teil der Zeit geladen werden. Es ist schwierig, Jobs zu planen, die sich so verhalten.

Antwort

Übrigens, diese Frage ist möglicherweise besser für den Stapelüberlauf. oder vielleicht unix.stackexchange oder vielleicht Serverfehler. Ich denke, diese Seite konzentriert sich weniger auf Fragen, bei denen es nicht um Entscheidungen geht, die auf kreativen Verdiensten oder zumindest auf wahrnehmbarer Video- / Audioqualität beruhen. Mir geht es jedoch nur um technische Details, also werde ich antworten.

FFmpeg verwendet standardmäßig Multithreading, sodass Sie wahrscheinlich -threads 0 nicht benötigen. Wenn Ihre Codierung bei einem Single-Threaded-Filter oder -Decoder einen Engpass aufweist, wird auf einem Kern die volle Last und auf vielen anderen Kernen eine geringe Last angezeigt.

Sie können auch die Medien Ihres Ausgabevideos überprüfen. x264 belässt seine Einstellungen in einer ASCII-Zeichenfolge im h.264-Header. Also entweder strings -n20 oder mediainfo, um Folgendes zu erhalten:

... Chroma subsampling : 4:2:0 Bit depth : 8 bits Scan type : Progressive Bits/(Pixel*Frame) : 0.051 Stream size : 455 MiB (89%) Writing library : x264 core 146 r2538+1 d48ec67 Encoding settings : cabac=1 / ref=6 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=10 / psy=1 / psy_rd=0.70:0.10 / mixed_ref=1 / me_range=24 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-3 / threads=4 / lookahead_threads=1 / sliced_threads=0 / nr=50 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=5 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=60 / rc=crf / mbtree=1 / crf=22.5 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=3:0.60 Color primaries : BT.709 Transfer characteristics : BT.709 Matrix coefficients : BT.709 

Hinweis die „threads = 4“ drin. Ich glaube, ich habe das auf meinem Quad-Core i5 2500k manuell eingestellt, anstatt x264 die Standard-CPUs * 1.5 verwenden zu lassen, da ich einen CPU-intensiven Filter (hqdn3d und lanczos-downscale) laufen ließ.

Wie auch immer, libx264 mit einer Voreinstellung wie slower sollte keine Probleme haben, viele Kerne beschäftigt zu halten. Es gibt einige Teile der Codierung, die von Natur aus seriell sind (z. B. die CABAC-Codierung des endgültigen Bitstroms), sodass ein Video mit hoher Bitrate nicht viel CPU-Zeit für die Verfeinerung von Referenzen benötigt (hoch subme) auf mehrere Frames (hoch ref) zeigt möglicherweise ein Lademuster wie Ihres an (ein Thread verwendet 100% CPU, andere nicht).

I. „Ich bin mir nicht 100% sicher, ob schnellere Presets weniger parallel sind, aber ich weiß, dass CABAC seriell ist.

Um massiv parallel zu werden, könnte libx264 eine Schiffsladung RAM verwenden, um Frames zu behalten und Lookahead für 2 auszuführen oder mehr GOPs und codieren diese unabhängig voneinander. Es gibt jedoch keine Option, um auf diese Weise zu arbeiten.

Eine Möglichkeit, VIELE Kerne zu verwenden, besteht darin, mehrere separate Codierungen parallel auszuführen, anstatt nur eine Reihe einzelner Codierungen mit allen Kernen. Dies funktioniert nur, wenn Sie mehrere Eingabedateien haben, die separat codiert werden sollen. Sie tauschen den Threading-Overhead gegen mehr Speicherkapazität und Bandbreite aus (mit Auswirkungen auf das Caching, es sei denn, dies ist auf einem Multi-Socket-System mit separatem L3 und DRAM Für jeden CPU-Cluster und sind die Prozesse an Kerne angeheftet, sodass eine Codierung die Kerne in einem Socket und der andere den anderen verwendet.

Kommentare

  • Danke für den Einblick. Ich habe hier hauptsächlich gefragt, weil ich ‚ überhaupt keine Fragen zu “ code “ und mehr darüber, was sich hinter den Kulissen abspielt und dachte, dies würde besser passen. Ich ‚ werde die Aufmerksamkeit des Moderators auf die Migration lenken und dann können sie den Anruf tätigen.
  • Im Moment ‚ Einfügen einer Nachricht in eine AWS SQS-Warteschlange, die einen Link zu jeder Datei enthält. In dieser Instanz wird ein Job ausgeführt, der auf diese Nachrichten wartet, die Datei herunterlädt, sie transkodiert und die Ausgabedateien nach Abschluss jedes Vorgangs hochlädt. Wenn ich dies richtig lese, sagen Sie ‚, dass es für uns wahrscheinlich sinnvoller wäre, einige dieser Arbeitsprozesse zu starten und mehrere Dateien parallel zu transkodieren, anstatt Versuchen Sie, alle Kerne auf einen einzigen Prozess zu fokussieren?
  • Ja, wenn Sie ‚ Probleme haben, mehr Kerne zu sättigen, ‚ ist in Ordnung, um eine Codierung oder 3 parallel auszuführen. Ich denke, x264 sollte in der Lage sein, die meisten Ihrer 32 Kerne zu sättigen, aber vielleicht nur mit einer langsameren Voreinstellung. Veröffentlichen Sie Ihre ffmpeg-Cmdline-Optionen und die Konsolenausgabe in Ihrer Frage. IDK, wenn Sie ‚ etwas Dummes und minderwertiges wie -preset veryfast verwenden. Wenn ja, kann die Dekodierung der Eingabe der Single-Thread-Engpass sein. Oder wie gesagt, vielleicht ein langsamer Filter.
  • Sie ‚ werden sicherlich das Herunterladen / Hochladen eines xcodes mit der CPU-Auslastung eines anderen überlappen wollen xcode, wenn Sie ‚ nicht vorhaben, im laufenden Betrieb zu / von ffmpeg zu streamen, um es für die Produktion zu verwenden. (Es kann möglich sein, das Äquivalent von -movflags +faststart im laufenden Betrieb mit einem anderen Muxer zu erhalten. Ich glaube, ich habe etwas darüber gelesen. Andernfalls, wenn Sie ‚ Wenn Sie mp4 ausgeben, müssen Sie in eine Datei ausgeben, damit ffmpeg das Atom moov nach vorne setzen und die Daten mischen kann Wenn die Codierung abgeschlossen ist.)
  • Oh, ich habe gerade Ihr Q genauer gelesen. Wenn Sie ‚ alle 3 Formate auf einmal ausgeben (mit derselben ffmpeg-Befehlszeile, sodass die Dekodierung der Eingabe nur einmal erfolgen muss), dann wenn einer der 3 Encoder ist Single-Threaded, es wird den gesamten Prozess Engpass. Ich denke, libtheora ist nicht multithreaded. wiki.xiph.org/TheoraEncoders sagt, dass es eine Multithread-Gabel gab, die jedoch gestorben ist. (Vielleicht hat es nie gut funktioniert oder war ‚ nicht mit anderen Encoder-Verbesserungen kompatibel? Könnte viele Gründe haben, warum ‚ nicht zusammengeführt wurde.) lists.xiph.org/pipermail//theora-dev/2015-February/004374.html

Antwort

libtheora ist Single-Threaded. Es gibt einen experimentellen Multithread-Build, der jedoch nicht beibehalten wird. Ich würde vorschlagen, es parallel zu den anderen Codierungen auszuführen. Verwenden Sie nach Möglichkeit auch libfdk-aac über libfaac.Viel höhere Audio-Wiedergabetreue bei gleicher Bitrate.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.