Automatische Konvertierung/Codierung von Videos für Video-On-Demand-Streaming

Ich benötige eine automatische Lösung zum Konvertieren von Videoclips für Video-on-Demand-Streaming in HTML5 (mp4/x264, webm/vp8) und Flash (mp4/x264). Für eine Seite wie Youtube, nur viel kleiner.

Die Eingabedateien sind meistens h264/x264, aber manchmal auch andere (wie divx/xvid) und haben eine andere Auflösung und enthalten manchmal Untertitel (.ass), die hart gebrannt werden müssen. Die Ausgabeauflösung sollte 720p und 480p für >=720p-Video, 480p für 480p-720p und die Originalauflösung für alles andere sein.

Auf dem Server läuft Debian.

Ich konnte kein Open-Source-Projekt finden, nur einige Cloud-Dienste (SaaS), die diese Art der Konvertierung anbieten. Ich habe versucht, mit ffmpeg zu arbeiten, aber jedes Video benötigt eine andere Bitrate, um immer noch in guter Qualität zu sein und eine Dateigröße zu haben, die Video-on-Demand ermöglicht. Wenn das Eingangsvideo schlecht ist, sollte das Ausgangsvideo nicht größer sein. Ich habe keine Ahnung, wie ich die x264/vp8-Parameter richtig einstellen soll, und natürlich kann ich das nicht manuell tun.

Kennen Sie ein (Linux-)Tool dafür? Es gibt viele Videoseiten da draußen, wie machen sie das? Ich habe mir Videodateien von YouTube angesehen und sie unterscheiden sich alle in Bitrate und Dateigröße. Oder kennen Sie eine Website oder ein Tutorial, das mir helfen könnte? Ich habe viel Zeit damit verbracht, nach Tipps zu suchen, aber ich kann einfach nichts finden, vielleicht suche ich nach den falschen Begriffen.

Antworten (2)

Für einen Server möchten Sie auf jeden Fall ffmpeg. Ich würde auch dringend empfehlen , es selbst zu kompilieren (das sind Ubuntu-Anweisungen, sollten aber auch für Debian funktionieren AFAIK) - der beste verfügbare AAC-Encoder für ffmpeg (libfdk_aac) kann nicht neben x264 (wegen der GPL) und der Version von ffmpeg in den Repositories ist wahrscheinlich zu alt für einige der Dinge, die ich hier auflisten werde.

MP4

So konvertieren Sie ein beliebiges Video mit libx264 und libfdk_aac in MP4:

ffmpeg -i input.avi -c:v libx264 -crf 24 -preset veryfast \
-ac 2 -c:a libfdk_aac -vbr 3 -movflags faststart output.mp4

Steuern Sie die Qualität des Videos mit -crf: Eine niedrigere Zahl bedeutet eine bessere Qualität, aber eine größere Datei. 18 ist unter den meisten Umständen visuell verlustfrei, und 24 sollte für Online-Streaming mehr als gut genug sein. Verwenden Sie a -preset, um die Geschwindigkeit/Größe des Videos zu steuern: Eine langsamere Voreinstellung bedeutet eine kleinere Datei (die Voreinstellungen sind ultraschnell, superschnell, sehr schnell, schneller, schnell, mittel, langsam und langsamer). Siehe hier für mehr Details.

Steuern Sie die Audioqualität mit -vbr: Die Skala ist 1-5, wobei 5 die beste Qualität ist. Eigentlich sollte sogar ein vbr von 1 für deine Zwecke ausreichen. Siehe hier für mehr Details. -ac 2bedeutet, dass ffmpeg 2 Audiokanäle ausgibt und bei Bedarf abmischt; Sie müssen es nur wirklich verwenden, wenn Sie glauben, dass die Leute 5.1-Surround-Sound-Audio oder ähnliches senden werden.

-movflags faststartist für Internet-MP4-Videos erforderlich.

WEBM

.webm ist etwas komplizierter. libvpx (der VP8-Encoder) sollte einen crf-Modus haben, der ähnlich wie x264 funktioniert, aber er ist derzeit defekt . Leider müssen Sie stattdessen auf eine Bitrate abzielen. Für die Standardauflösung sollten 1000 kb/s eine sehr gute Qualität ergeben (tatsächlich ist das wahrscheinlich übertrieben). Für volles 1080p-HD ergeben etwa 5000 kb/s eine wirklich gute Qualität (auch hier können Sie wahrscheinlich niedriger gehen - probieren Sie es aus und sehen Sie). Etwa 2200kb/s sollten es für 720p tun.

ffmpeg -i input.avi -c:v libvpx -b:v 1000k \
-c:a libvorbis -q:a 4 -ac 2 output.webm

HINWEIS - Stellen Sie sicher, dass Sie libvorbis (die xiph.org-Encoder-Bibliothek) verwenden, NICHT vorbis (den minderwertigen internen ffmpeg-Encoder). Stellen Sie die Qualität mit -q:aein: Der Bereich ist -1-10, wobei 10 die beste Qualität ist und 5 nicht von einer Original-CD zu unterscheiden ist. 3 oder 4 sollten für Online-Streaming-Zwecke ausreichend sein.

Untertitel & Video skalieren

Um Untertitel fest zu codieren, müssen Sie sie zuerst aus der Originaldatei extrahieren und dann entweder den Ass-Filter oder den Untertitelfilter verwenden, um sie zu codieren. Verwendung des Untertitelfilters:

ffmpeg -i input.mkv -map 0:s:0 -c:s ass subtitle.ass
ffmpeg -i input.mkv -filter:v 'subtitles=subtitle.ass' \
-c:v libx264 -crf 24 -preset veryfast \
-c:a libfdk_aac -vbr 3 -movflags faststart output.mp4 \
-filter:v 'subtitles=subtitle.ass' \
-c:v libvpx -b:v 1000k \
-c:a libvorbid -q:a 4 output.webm

Um Videos zu skalieren, verwenden Sie den Skalierungsfilter. -1:480bedeutet 'für die Breite das eingegebene Seitenverhältnis beibehalten und die Höhe auf 480 skalieren'.

ffmpeg -i input.avi -filter:v 'scale=-1:480' \
-c:v libx264 -crf 24 -preset veryfast \
-c:a libfdk_aac -vbr 3 -movflags faststart output.mp4 \
-filter:v 'scale:-1:480' \
-c:v libvpx -b:v 1000k \
-c:a libvorbid -q:a 4 output.webm

Sie können die Skalen- und Untertitelfilter wie folgt kombinieren:

ffmpeg -i input.mkv -filter:v 'scale=-1:480,subtitles=subtitle.ass' \
-c:v libx264 -crf 24 -preset veryfast \
-c:a libfdk_aac -vbr 3 -movflags faststart output.mp4 \
-filter:v 'scale:-1:480,subtitles=subtitle.ass' \
-c:v libvpx -b:v 1000k \
-c:a libvorbid -q:a 4 output.webm

Wahrscheinlich möchten Sie ein Bash-Skript verwenden, um die Eingabehöhe zu erkennen und das Vorhandensein von Untertiteln zu testen. Ich persönlich würde mediainfo verwenden, um diese Informationen zu finden, es ist ziemlich zugänglich für Regex.

Das sollte reichen, um dich zum Laufen zu bringen.

Die Videotranscodierung ist sehr verwirrend und es gibt viele verschiedene Optionen.

Wenn Sie FFMpeg nicht verwenden möchten, können Sie VLC ausprobieren

Lesen Sie hier mehr über die Transcodierung mit VLC

Andernfalls ist FFMpeg (oder eine Art Wrapper-Tool) die beste Wahl. Indem Sie die Option -vb weglassen, überlassen Sie FFMpeg die Entscheidung über die Bitrate. Es gibt auch einige Voreinstellungen, die Sie zum Kodieren für bestimmte Geräte und Qualitäten verwenden können, wie z. B. ipod640.

Ich habe eine winzige Java-Anwendung erstellt, die Videos aus einer Que (mit MySQL) transkodiert, aber ein Cronjob und ein Shell-Skript sind auch eine gute Lösung