Dies ist mein aktueller Befehl zum Ändern der Größe von Videos (1080p) von 2 GB auf 300 MB, der jedoch viel Zeit in Anspruch nimmt:
mkdir newfiles
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"
pause
Ich habe nvenc mit meiner NVIDIA GTX1070 ausprobiert:
mkdir newfiles
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"
pause
Die Ausgabegröße beträgt immer 3⨉ oder 5⨉ der Originalgröße - nvenc wird nicht verwendet -crf
.
Wie verwende ich nvenc mit ffmpeg, um ein Video mit hoher Qualität und kleiner Größe zu konvertieren / zu skalieren? Soll ich die GPU zum Codieren verwenden?
ffmpeg
video-encoding
hongducwb
quelle
quelle
slow
umfast
in Ihrem ersten Befehl. CRF ist in nicht implementiertnvenc
.Antworten:
Übergeben Sie für CRF-basierte Codierungen die folgenden Argumente im folgenden Codeausschnitt an FFmpeg:
Natürlich müssen Sie die Zielbitraten und einen festen
cq
Wert anpassen . 19 ist die empfohlene Einstellung, da sie visuell mit 0 identisch ist und dennoch einen guten Komprimierungskomfort in Bezug auf die Dateigröße bietet. In diesem Artikel erfahren Sie mehr über die Funktionsweise von CNI.Es ist zu beachten, dass die
-cq
Skala logarithmisch ist, was bedeutet, dass 0 im Wesentlichen verlustfrei ist und 51 das absolut schlechteste wäre.Die Qualität kann durch Hinzufügen von Optionen wie B-Frames weiter verbessert werden (beschränken Sie diese auf höchstens 3, und dies erfordert das H.264-Hauptprofil und höher. Basisprofile unterstützen keine B-Frames. Übergeben Sie dazu
-bf {uint}
an der Video-Encoder, so dass-bf:v 4
der Encoder 4 B-Frames verwenden würde.Die wichtigsten Bestandteile sind das
-cq:v 19
und die-rc:v vbr_hq
Argumente, mit denen Sie den Encoder sowohl mit einer voreingestellten variablen Bitrate als auch mit einer maximal zulässigen Bitrate (-b:v
und-maxrate:v
) abstimmen können, während Sie einen CRF-Wert von 19 einhalten .Und jetzt ein paar Anmerkungen zu NVENC und zur Optimierung für hochwertige Codierungen:
Wie bei jedem anderen hardwarebasierten Encoder unterliegt NVENC mehreren Einschränkungen. Insbesondere bei HEVC gelten die folgenden bekannten Einschränkungen:
Auf Pascal:
Für HEVC-Codierungen gelten die folgenden Einschränkungen:
Turing bietet alle für Pascal verfügbaren Verbesserungen, einschließlich der B-Frame-Unterstützung für HEVC und der Möglichkeit, B-Frames als Referenz zu verwenden. In dieser Antwort finden Sie ein Beispiel für diese Funktion.
Und bei Maxwell Gen 2 (GPUs der GM200x-Serie):
Bei der HEVC-Codierung fehlen die folgenden Funktionen:
Die Auswirkung für Maxwell ist, dass bewegungsintensive Szenen mit HEVC unter eingeschränkten Bitraten aufgrund der fehlenden Lookahead-Funktionen und der SAO-Schleifenfilterfunktionen (Adaptive Sample Offset) unter Artefakten (Blockiness) leiden können. Pascal hat diese Funktion etwas verbessert, aber je nach der Version des SDK, mit dem der Video-Encoder erstellt wurde, sind möglicherweise nicht alle Funktionen verfügbar.
Beispielsweise erfordert der Modus für gewichtete Vorhersage für H.264-Codierungen in Pascal NVENC SDK 8.0x und höher, und dieser Codierungsmodus deaktiviert auch die B-Frame-Unterstützung. Ebenso kann die Kombination von hardwarebasierten Skalierern, die auf den Nvidia Performance Primitives (NPP) mit NVENC ausgeführt werden, zu Leistungsverbesserungen bei Videoskalierungsanwendungen führen, und zwar auf Kosten der Skalierung von Artefakten, insbesondere bei hochskaliertem Inhalt. Dies wirkt sich auch auf die Videokodierungs-Pipeline aus, da die NPP-Skalierungsfunktionen von den CUDA-Kernen auf der GPU ausgeführt werden. Daher sollte die durch die zusätzliche Last verursachte Auswirkung auf die Leistung von Fall zu Fall analysiert werden, um festzustellen, ob die Leistungsqualität stimmt Kompromiss ist akzeptabel.
Beachten Sie Folgendes: Ein hardwarebasierter Encoder bietet immer eine etwas geringere Anpassung als eine entsprechende softwarebasierte Implementierung, sodass sich Ihre Laufleistung und die akzeptable Ausgabequalität immer unterscheiden.
Und für ihre referenz:
Mit FFmpeg können Sie jederzeit auf die Einstellungen eines Encoders zugreifen, um sie anzupassen:
Für NVENC-basierte Encoder können Sie also Folgendes ausführen:
Sie können auch alle NVENC-basierten Encoder und NPP-basierten Scaler (sofern als solche erstellt) anzeigen, indem Sie Folgendes ausführen:
Beispielausgabe auf meinem Prüfstand:
quelle
vbr_minqp
scheint jetzt veraltet zu sein. Ich bin einverstanden, dass diese Antwort missverstanden werden könnte, da es keinen CRF-Modus für gibth264_nvenc
.Ich glaube, ich habe eine Lösung gefunden:
Es scheint, dass h264_nvenc
-qp
anstelle von verwendet-crf
. Diese Option funktioniert nur, wenn auf eingestellt-rc
istconstqp
.quelle
-qp
ist jeder anders als-crf
. h264_nvenc 's-qp
entspricht libx264 ' s-qp
Zum
-crf
Ersetzen von libx264 kann-cq
oder-qp
von h264_nvenc sein:-crf
Wählen Sie die Qualität für den konstanten Qualitätsmodus-cq
Stellen Sie die Zielqualitätsstufe (0 bis 51, 0 bedeutet automatisch) für den Konstantqualitätsmodus in der VBR-Ratensteuerung ein-qp
Regelungsmethode für konstante Quantisierungsparameterrate (von -1 bis 51) (Standard -1)Schnellste hardwarebeschleunigte Codierungsmethode:
-resize
Auflösung am Eingang (in Hardware); ffmpeg muss nicht mit--enable-libnpp
forscale_npp
filter kompiliert werden.Für mehr Information:
ffmpeg -h encoder=h264_nvenc
quelle