ffmpeg ausreizen

Sound, Digitalkameras, TV+Video und Spiele.
Antworten
Colttt
Beiträge: 2983
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

ffmpeg ausreizen

Beitrag von Colttt » 29.11.2019 09:01:05

Hallo ich habe unten angebene Video Datei, ich möchte diese gerne in FullHD und idealer weise auch in einem freien Format konvertieren, bis jetzt habe ich immer folgendes genutzt:

Code: Alles auswählen

ffmpeg -threads 8 -i C0001.MP4 -vf scale=1920:1080 -c:v libtheora -qscale:v 10 -c:a libvorbis -qscale:a 10 C0001_fhd.ogv
jedoch scheint das ganze dort nicht multithreading fähig zu sein. Gibt es einen Codec der das ist oder Verbesserungsvorschläge für das ganze da oben? Wenn man ein paar Datein konvertiert in der Größenordnung und es immer nur ein Kern nutzt dauert das leider ne halbe Ewigkeit

Code: Alles auswählen

Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C0034.MP4':
  Metadata:
    major_brand     : XAVC
    minor_version   : 16785407
    compatible_brands: XAVCmp42iso2
    creation_time   : 2019-11-28T16:56:16.000000Z
  Duration: 01:21:09.60, start: 0.000000, bitrate: 56969 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-4), 3840x2160 [SAR 1:1 DAR 16:9], 55226 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2019-11-28T16:56:16.000000Z
      handler_name    : Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, stereo, s16, 1536 kb/s (default)
    Metadata:
      creation_time   : 2019-11-28T16:56:16.000000Z
      handler_name    : Sound Media Handler
    Stream #0:2(und): Data: none (rtmd / 0x646D7472), 204 kb/s (default)
    Metadata:
      creation_time   : 2019-11-28T16:56:16.000000Z
      handler_name    : Timed Metadata Media Handler
      timecode        : 83:01:01;02
vielen dank schonmal!
Debian-Nutzer :D

ZABBIX Certified Specialist

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: ffmpeg ausreizen

Beitrag von wanne » 29.11.2019 09:36:09

Gibt es einen Codec der das ist oder Verbesserungsvorschläge für das ganze da oben?
Googles libvpx für VP8 und VP9 kann ein bisschen multithreading. Defakto wird es dadurch kaum schneller, kann nur wenige Kerne nutzten und ist sowieso viel langsamer als Theora. Google interessiert sich halt nicht wirklich für multithreading: Die haben auf youtube so viele Videos, dass sie halt 24 gleichzeitig encodieren um ihre 24-Kerne auszulasten. Und genug Rechenleistung, dass es ihnen die encoding Geschwindigkeit Wurst ist.


Wenn es dir zu langsam geht willst du mit vp9_vaapi (bzw. vp8_vaapi) eine Grafikkarte nutzen. Kann Intel ab Kaby Lake (bzw. ab Braswell).
CPU Encoding ist heute halt für Leute die vieeeel Zeit gegen wenige Prozent bessere Kompression tauschen wollen. Entsprechend wenig wird da optimiert.


Abseits vom Thema: Nimm Opus! (Der offizielle Nachfolger von vorbis.) Der liefert dir (bei gleicher Bitrate) einfach um Größenordnungen bessere Qualität wie vorbis oder mp3.
rot: Moderator wanne spricht, default: User wanne spricht.

Colttt
Beiträge: 2983
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: ffmpeg ausreizen

Beitrag von Colttt » 29.11.2019 14:47:04

ich hab jetzt folgendes:

Code: Alles auswählen

time ffmpeg -threads 8 -i C0029.MP4 -vf scale=1920:1080 -c:v libvpx-vp9 -crf 10 -b:v 0 -row-mt 1 -c:a libopus C0029_fhd.webm
aber das dauert leider auch ewig.. das ding geht 49minuten

Code: Alles auswählen

frame= 5683 fps=0.4 q=0.0 size=  582641kB time=00:03:47.51 bitrate=20978.9kbits/s speed=0.0159x 
und das ganze läuft schon ca 4h mit dem konvertieren
Debian-Nutzer :D

ZABBIX Certified Specialist

Benutzeravatar
Lord_Carlos
Beiträge: 5578
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: ffmpeg ausreizen

Beitrag von Lord_Carlos » 29.11.2019 15:02:01

0.4 fps?
Da wuerde ich mal Testweise den neuen av1 codec versuchen. Sparst auch noch 30% Plattenplatz :)
Auch frei, braucht aber auch gut ressourcen beim encoden. Aber vielleicht geht der schneller.

Gibt wohl mehrere open source av1 encoder
rav1e: https://github.com/xiph/rav1e und
SVT-AV1 https://github.com/OpenVisualCloud/SVT-AV1

ffmpeg hat wohl libaom-av1 eingebaut, was aber sehr sehr langsam ist.

Sonst in den sauren Apfel beisen und h264 nehmen. Nicht open source, aber Lizenzen sind glaube ich abgelaufen.
Solange bis es ein guten av1 encoder in debians ffmpeg gibt. Debian 11?

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Benutzeravatar
Tintom
Moderator
Beiträge: 3029
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: ffmpeg ausreizen

Beitrag von Tintom » 29.11.2019 18:13:01

Lord_Carlos hat geschrieben: ↑ zum Beitrag ↑
29.11.2019 15:02:01
Sonst in den sauren Apfel beisen und h264 nehmen. Nicht open source, aber Lizenzen sind glaube ich abgelaufen.
Zumal man damit auch per GPU encodieren kann, geeignete Hardware vorausgesetzt.

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: ffmpeg ausreizen

Beitrag von wanne » 30.11.2019 17:11:03

aber das dauert leider auch ewig.. das ding geht 49minuten
Ich habe dich ja gewarnt:
und ist sowieso viel langsamer als Theora
Gibt wohl mehrere open source av1 encoder
Als ich das letzte mal getestet habe (Debian 9) gab es aber noch keinen einzigen Player, der das direkt abspielen konnte.
Sonst in den sauren Apfel beisen und h264 nehmen. Nicht open source, aber Lizenzen sind glaube ich abgelaufen.
Ne und die MPEG-LA klagt auf fleißig, wenn du es ohne Lizenz benutzt. Für den Privaten gebrauch liegt aber jeder NVIDIA-Grafikkarte eine Lizenz bei. Daneben ist die Nutzung auf öffentlichen Webseiten. (Also solche ohne Login.) Kostenlos. (Nicht aber das erstellen des Videos selbst.) MP3 sind die Patente abgelaufen.
Siehe auch: https://www.mpegla.com/programs/avc-h-264/patent-list/
Tintom hat geschrieben: ↑ zum Beitrag ↑
29.11.2019 18:13:01
Lord_Carlos hat geschrieben: ↑ zum Beitrag ↑
29.11.2019 15:02:01
Sonst in den sauren Apfel beisen und h264 nehmen. Nicht open source, aber Lizenzen sind glaube ich abgelaufen.
Zumal man damit auch per GPU encodieren kann, geeignete Hardware vorausgesetzt.
Das kann er auch mit VP9. Und ich würde das auch empfehlen! Wie gesagt:
wanne hat geschrieben: ↑ zum Beitrag ↑
29.11.2019 09:36:09
Wenn es dir zu langsam geht willst du mit vp9_vaapi (bzw. vp8_vaapi) eine Grafikkarte nutzen. Kann Intel ab Kaby Lake (bzw. ab Braswell).
CPU Encoding ist heute halt für Leute die vieeeel Zeit gegen wenige Prozent bessere Kompression tauschen wollen. Entsprechend wenig wird da optimiert.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Tintom
Moderator
Beiträge: 3029
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: ffmpeg ausreizen

Beitrag von Tintom » 01.12.2019 15:06:13

wanne hat geschrieben: ↑ zum Beitrag ↑
30.11.2019 17:11:03
Das kann er auch mit VP9. Und ich würde das auch empfehlen! Wie gesagt:
Das habe ich eiskalt überlesen. Danke! :mrgreen:

Colttt
Beiträge: 2983
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: ffmpeg ausreizen

Beitrag von Colttt » 02.12.2019 08:48:23

hmm.. leider klappt das nicht so recht, ich bekomme da immer ne Fehlermeldung..

Code: Alles auswählen

time ffmpeg -threads 8 -i C0029.MP4 -vf scale=1920:1080 -c:v vp9_vaapi -crf 10 -row-mt 1 -c:a libopus C0029_test.webm
ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C0029.MP4':
  Metadata:
    major_brand     : XAVC
    minor_version   : 16785407
    compatible_brands: XAVCmp42iso2
    creation_time   : 2019-11-28T12:34:24.000000Z
  Duration: 00:49:25.92, start: 0.000000, bitrate: 55079 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-4), 3840x2160 [SAR 1:1 DAR 16:9], 53336 kb/s, 25 fps, 25 tbr, 25k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2019-11-28T12:34:24.000000Z
      handler_name    : Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(und): Audio: pcm_s16be (twos / 0x736F7774), 48000 Hz, stereo, s16, 1536 kb/s (default)
    Metadata:
      creation_time   : 2019-11-28T12:34:24.000000Z
      handler_name    : Sound Media Handler
    Stream #0:2(und): Data: none (rtmd / 0x646D7472), 204 kb/s (default)
    Metadata:
      creation_time   : 2019-11-28T12:34:24.000000Z
      handler_name    : Timed Metadata Media Handler
      timecode        : 83:01:01;02
Codec AVOption crf (Select the quality for constant quality mode) specified for output file #0 (C0029_test.webm) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Codec AVOption row-mt (Row based multi-threading) specified for output file #0 (C0029_test.webm) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> vp9 (vp9_vaapi))
  Stream #0:1 -> #0:1 (pcm_s16be (native) -> opus (libopus))
Press [q] to stop, [?] for help
Impossible to convert between the formats supported by the filter 'Parsed_scale_0' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
Conversion failed!

real    0m0,452s
user    0m0,794s
sys     0m0,170s

EDIT:
neuer Fehler..

Code: Alles auswählen

sudo LIBVA_DRIVER_NAME=i965  ffmpeg -loglevel debug -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i C0029.MP4 -c:v vp9_vaapi -crf 10 test_out.webm
[...]
[AVHWDeviceContext @ 0x55e386159a00] Opened VA display via DRM device /dev/dri/renderD128.
[AVHWDeviceContext @ 0x55e386159a00] libva: VA-API version 1.1.0
[AVHWDeviceContext @ 0x55e386159a00] libva: va_getDriverName() returns -1
[AVHWDeviceContext @ 0x55e386159a00] libva: User requested driver 'i965'
[AVHWDeviceContext @ 0x55e386159a00] libva: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
[AVHWDeviceContext @ 0x55e386159a00] libva: Found init function __vaDriverInit_1_1
[AVHWDeviceContext @ 0x55e386159a00] libva: /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so init failed
[AVHWDeviceContext @ 0x55e386159a00] libva: va_openDriver() returns -1
[AVHWDeviceContext @ 0x55e386159a00] Failed to initialise VAAPI connection: -1 (unknown libva error).
Device creation failed: -5.
irgendwie scheint hier nen Bug zu sein, kann das jemand bestätigen?
Debian-Nutzer :D

ZABBIX Certified Specialist

MaGe
Beiträge: 1708
Registriert: 01.06.2014 17:12:16

Re: ffmpeg ausreizen

Beitrag von MaGe » 02.12.2019 13:51:53

Colttt @

crf wird nicht unterstützt -qp oder -cq und -b:v

unterstützt deine grafikkarte vp9 vaapi?


gruss MaGe
Wir müssen uns vor der Klimaerwärmung nicht fürchten.
Uns rottet die soziale Kälte viel früher aus.

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: ffmpeg ausreizen

Beitrag von wanne » 02.12.2019 17:25:46

Da fehlt auf jeden Fall mal Debiani965-va-driver-shaders.

Was du gerade encoden kannst siehst du mit:

Code: Alles auswählen

vainfo | grep EncSlice
Daneben willst du vielleicht das Decoding nicht in Hardware machen.

Code: Alles auswählen

-hwaccel vaapi
schalten hardware-decoding an.
Also wenn es funktioniert ist alles gut.
Wenn nicht sparst du dir eine menge ärger, wenn du es in SW machst und -hwaccel vaapi weg lässt. Das decoden ist nicht so der Zeitfresser.

Daneben musst du dem ffmpeg sagen, dass er das Video in die GPU schmeißen soll:

Code: Alles auswählen

-vf 'format=nv12,hwupload' 
Und die Qualität setzen.

Code: Alles auswählen

-global_quality:v 50
Der Intel encoder ist leider eher "dumm".
a) verreist er ganz gerne die ersten paar Frames. Sieht dann mega hässlich aus, wenn die nicht schwarz sind. – Eventuell was vorne dran hängen und wieder abschneiden...
b) ist die Qualität stark von der Auflösung abhängig: Willst du bei 4k irgend wie >110 haben. (120 ist die schlechteste Qualität, 1 die Beste.) Bei HD ist das nicht guckbar.

Das volle Kommando ist dann (btw. sollte das ohne root gehen, wenn du eh schon den Bildschirm nutzt. Nur wenn du dich per ssh einloggst darfst du die Grafikkarte nicht nutzen.):

Code: Alles auswählen

ffmpeg -t 12 -hwaccel vaapi  -vaapi_device /dev/dri/renderD128 -i ~/Downloads/bbb_sunflower_native_60fps_normal.mp4 -ac 1 -b:a 80k  -filter:v 'scale=920:1080, format=nv12,hwupload' -c:v vp8_vaapi -global_quality:v 50 /tmp/out.webm
Noch ein Kommentar:
Ich nutze wie du den Filter zum skalieren:

Code: Alles auswählen

-vf scale=1920:1080
Filter sind im ffmpeg leider stinkenlahm. Am ende hast du super schnelles Hardware-Encoding und wartest de ganze Zeit aufs verkleinern. Mit -s bist du schneller. Leider kann das der vp8_vaapi nicht. Man kann jetzt zuerst eine zusätzliche Umwandlung in MPEG2 machen und da auf die richtige Größe stutzen. Wenn man das Zwischenvideo mit extrem großer Qualität (und Dateigröße) macht das an der Qualität kaum Unterschiede und ist bei großen input-Auflösungen oft schneller als direkt. – Würde ich mir aber nicht antun.

Zuletzt:
Zwei (komplexe) Filter nacheinander:

Code: Alles auswählen

-filter:v 'scale=920:1080, format=nv12,hwupload'
Zu letzt: Man bekommt bei VP8 oft deutlich bessere Qualität/Dateigrößen verhältnisse wenn man einfach die Anzahl der Pixel hoch dreht und dafür die "Qualität" runter. (Sprich gleiche Bitrate/kleineren crf.)
rot: Moderator wanne spricht, default: User wanne spricht.

MaGe
Beiträge: 1708
Registriert: 01.06.2014 17:12:16

Re: ffmpeg ausreizen

Beitrag von MaGe » 02.12.2019 18:34:18

wanne hat geschrieben: Und die Qualität setzen.

-global_quality:v 50
Using global_quality with nvenc is deprecated. Use qp instead.
Die Verwendung von global_quality mit nvenc ist veraltet. Verwenden Sie stattdessen qp.
wird mit aller wahrscheinlichkeit auch auf vp9_vaapi zutreffen.


gruss MaGe
Wir müssen uns vor der Klimaerwärmung nicht fürchten.
Uns rottet die soziale Kälte viel früher aus.

Colttt
Beiträge: 2983
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: ffmpeg ausreizen

Beitrag von Colttt » 03.12.2019 15:24:57

ich hab die neuste Version von ffmpeg gefunden und damit getestet, es läuft schneller, zwar ohen hardwareunterstützung aber schneller..

Code: Alles auswählen

 Ausgangsformat 4k (3840×2160); 4,5GB; h264; 10:39min

VP9:
        Aufruf: time ffmpeg -threads 22 -i C0033.MP4 -vf scale=1920:1080 -c:v libvpx-vp9 -crf 10 -b:v 0 -row-mt 1 -c:a libopus C0033_vp9.webm
        Zeit: 154m42,518s
        Größe: 3,5G
        frame=15996 fps=1.7 q=0.0 Lsize= 3573058kB time=00:10:39.85 bitrate=45745.6kbits/s speed=0.0689x
        video:3567105kB audio:5597kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.009947%

theora:
        Aufruf: time ffmpeg -threads 22 -i C0033.MP4 -vf scale=1920:1080 -c:v libtheora -qscale:v 10 -c:a libvorbis -qscale:a 10 C0033_theora.ogv
        Zeit: 43m48,117s  
        Größe: 4,0G
        frame=15996 fps=6.1 q=-0.0 Lsize= 4157090kB time=00:10:39.84 bitrate=53224.1kbits/s speed=0.243x
        video:4108464kB audio:30456kB subtitle:0kB other streams:0kB global headers:7kB muxing overhead: 0.439003%
Qualitätsunterschiede habe ich keine gesehen, erstaunlich nur das VP9 trotz Multithreadingunterstützung langsamer ist als theora ohne
Debian-Nutzer :D

ZABBIX Certified Specialist

wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: ffmpeg ausreizen

Beitrag von wanne » 03.12.2019 17:30:28

Colttt hat geschrieben: ↑ zum Beitrag ↑
03.12.2019 15:24:57
Qualitätsunterschiede habe ich keine gesehen,
Das wundert mich jetzt nicht. -crf 10 ist verrückt klein.
Du kannst bis so -crf 25 hoch und ohne pixel für pixel vergleiche siehst du da nichts. Wenn du mit dem Theora-Ergebnis mit -qscale:v 10 auch noch zufrieden bist kannst du mindestens -crf 25 nehmen, was etwa die gleiche Qualität liefert (In meinem bbb-Video je ne SSIM 0.997. (Zum Vergleich:  -crf 10 liefert eine SSIM von 0.999!)
Ich würde dir aber mal empfehlen mit -crf 28 zu arbeiten. Der Qualitätsunterschied ist marginal (aber sichtbar), die Datei deutlich kleiner.

Colttt hat geschrieben: ↑ zum Beitrag ↑
03.12.2019 15:24:57
erstaunlich nur das VP9 trotz Multithreadingunterstützung langsamer ist als theora ohne
Finde ich nicht verwunderlich. Die Datei VP9-Datei ist trotz der verrückt hoch gewählten crf (die für grob 4 mal kleinere Fehler sorgt) ⅛ kleiner.
Das war die Idee hinter VP9: Bessere Kompression auf kosten der Encodierziet.
rot: Moderator wanne spricht, default: User wanne spricht.

Antworten