Also habe ich meine eigene Antwort zu lange gemacht.
TL; DR-Zusammenfassung: Zum verlustfreien Speichern einer Bildsequenz verwenden Sie libx264
oder libx264rgb
mit -preset ultrafast -qp 0
. Es ist fast so schnell wie ffvhuff, mit viel geringerer Bitrate und dekodiert schneller. huffyuv
wird außerhalb von ffmpeg viel häufiger unterstützt, unterstützt jedoch nicht so viele Pixelformate wie ffvhuff
. Dies ist ein weiterer Grund für die Verwendung von h.264, vorausgesetzt, Ihre anderen Tools können das h.264- High 4:4:4 Predictive
Profil verarbeiten, das x264 im verlustfreien Modus verwendet. x264 kann nur intern verwendet werden, wenn ein schneller wahlfreier Zugriff auf beliebige Frames erforderlich ist.
Achten Sie auf einen ffmpeg-Fehler, der sich auf libx264rgb auswirkt, wenn Sie aus einem Verzeichnis mit Bildern lesen. (Und wer weiß, in welchen anderen Fällen?) Testen Sie Ihr Setup vor der Verwendung auf Verlustfreiheit. (einfach mit ffmpeg -i in -pix_fmt rgb24 -f framemd5
on source und verlustfrei komprimiert)
edit: utvideo
codiert und decodiert ziemlich schnell und ist ein viel einfacherer Codec als h.264. Es handelt sich im Grunde genommen um ein modernes huffyuv
Modell mit Unterstützung für nützlichere Farbräume. Wenn Sie jemals ein Problem mit h.264 haben, versuchen Sie als nächstes utvideo für temporäre Dateien.
edit2: PNG als RGB-Codec scheint sich zumindest auf dem Sintel-Trailer gut zu machen.
Siehe auch meine ähnliche Antwort auf eine ähnliche Frage:
https://superuser.com/a/860335/20798
Die Antwort von Warren Young enthält viele Informationen zu verschiedenen Rohformaten und Codecs. Ich denke, die Antwort wäre nützlicher, wenn sie kürzer wäre, also gebe ich eine neue Antwort. Wenn Sie mit Software arbeiten, die verlustfreies x264 oder ffvhuff nicht unterstützt, sind einige dieser Informationen wahrscheinlich immer noch nützlich.
Die nützlichste Definition von "verlustfrei" in diesem Zusammenhang ist, dass Sie die Eingabe Bit für Bit wiederherstellen können. Machen Sie sich keine Sorgen über Qualitätsverluste durch Videokodierung, unabhängig davon, was Sie tun.
http://en.wikipedia.org/wiki/Chroma_subsampling
Vermeiden Sie im Idealfall mehrere Farbraumkonvertierungen. Die Rundungsfehler können sich möglicherweise aufbauen. Wenn Sie Ihr Video mit Filtern bearbeiten möchten, die im RGB-Farbraum funktionieren, ist es sinnvoll, diesen RGB-Wert beizubehalten, sofern die höheren Bitraten kein Problem darstellen. Sie werden wahrscheinlich letztendlich ein yuv 4:2:0
Video produzieren, aber abhängig von den Filtern, die Sie anwenden werden, ist es möglicherweise nützlich, die zusätzliche Chroma-Auflösung beizubehalten.
So oder so, lossless x264 und ffvhuff sowohl Unterstützung RGB und YUV 4:4:4
, 4:2:2
und 4:2:0
. Ich würde x264 vorschlagen, da es schnell zu dekodieren ist. Wenn Sie versuchen, RGB HD-Videos in Echtzeit wiederzugeben, versuchen Sie opengl anstelle von xv, da xv auf meinem System nur yuv-Eingaben akzeptiert. mplayer brauchte zusätzliche CPU-Zeit, um eine Farbraumkonvertierung durchzuführen.
Quelle für die folgenden Encodertests: https://media.xiph.org/ . https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz Sie haben vergessen, die y4m-Dateien für den Sintel-Trailer zu gzipen, daher ist der Png-Tarball tatsächlich viel kleiner.
ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac \
-c:a copy -c:v libx264rgb -preset ultrafast -qp 0 \
frompng.sintel.264rgb.mkv
z.B
peter@tesla:/mnt/GP1TB/p/encoder-sample/sintel$ time ffmpeg -i 1080/sintel_trailer_2k_%4d.png -i sintel_trailer-audio.flac -c:a copy -c:v libx264rgb -preset ultrafast -qp 0 frompng.sintel.264rgb.mkv
ffmpeg version N-67983-g2b358b4 Copyright (c) 2000-2015 the FFmpeg developers
built on Jan 10 2015 05:32:37 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
configuration: --enable-gpl --enable-version3 --enable-nonfree --disable-doc --disable-ffserver --enable-libx264 --enable-libx265 --enable-libmp3lame --enable-libopus --enable-libwebp --enable-libvpx --disable-outdev=oss --disable-indev=oss --disable-encoder=vorbis --enable-libvorbis --enable-libfdk-aac --disable-encoder=aac --disable-decoder=jpeg2000
libavutil 54. 16.100 / 54. 16.100
libavcodec 56. 20.100 / 56. 20.100
libavformat 56. 18.100 / 56. 18.100
libavdevice 56. 3.100 / 56. 3.100
libavfilter 5. 7.100 / 5. 7.100
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
libpostproc 53. 3.100 / 53. 3.100
Input #0, image2, from '1080/sintel_trailer_2k_%4d.png':
Duration: 00:00:50.12, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, rgb24, 1920x1080 [SAR 72:72 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Input #1, flac, from 'sintel_trailer-audio.flac':
Duration: 00:00:52.00, start: 0.000000, bitrate: 721 kb/s
Stream #1:0: Audio: flac, 48000 Hz, stereo, s16
File 'frompng.sintel.264rgb.mkv' already exists. Overwrite ? [y/N] y
No pixel format specified, rgb24 for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264rgb @ 0x2770760] using SAR=1/1
[libx264rgb @ 0x2770760] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264rgb @ 0x2770760] profile High 4:4:4 Predictive, level 4.0, 4:4:4 8-bit
[libx264rgb @ 0x2770760] 264 - core 144 r2525+2 6a4fca8 - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=0 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, matroska, to 'frompng.sintel.264rgb.mkv':
Metadata:
encoder : Lavf56.18.100
Stream #0:0: Video: h264 (libx264rgb) (H264 / 0x34363248), rgb24, 1920x1080 [SAR 72:72 DAR 16:9], q=-1--1, 25 fps, 1k tbn, 25 tbc
Metadata:
encoder : Lavc56.20.100 libx264rgb
Stream #0:1: Audio: flac ([172][241][0][0] / 0xF1AC), 48000 Hz, stereo (16 bit)
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> h264 (libx264rgb))
Stream #1:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 1253 fps= 18 q=-1.0 Lsize= 834790kB time=00:00:51.96 bitrate=131592.5kbits/s
video:830198kB audio:4575kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.002025%
[libx264rgb @ 0x2770760] frame I:6 Avg QP: 0.00 size:612470
[libx264rgb @ 0x2770760] frame P:1247 Avg QP: 0.00 size:678787
[libx264rgb @ 0x2770760] mb I I16..4: 100.0% 0.0% 0.0%
[libx264rgb @ 0x2770760] mb P I16..4: 50.3% 0.0% 0.0% P16..4: 12.0% 0.0% 0.0% 0.0% 0.0% skip:37.6%
[libx264rgb @ 0x2770760] coded y,u,v intra: 71.1% 68.2% 70.0% inter: 22.8% 22.8% 23.2%
[libx264rgb @ 0x2770760] i16 v,h,dc,p: 50% 48% 1% 1%
[libx264rgb @ 0x2770760] kb/s:135693.94
Beachten Sie, dass ich vergessen habe, anzugeben -r 24
fps , damit av nicht mit dem Audio synchron bleibt. (und die Bitrate (aber nicht die Dateigröße) ist ebenfalls deaktiviert. Der Standardwert für ffmpeg ist 25fps.) Die CPU in diesem Computer ist ein Core2duo 2.4GHz (E6600) der ersten Generation (conroe).
Ergebnisse:
4.5M sintel_trailer-audio.flac # this is muxed in to every mkv
948M 1080 # the directory of PNGs
940M /var/tmp/dl/sintel_trailer-1080-png.tar.gz
7434M sintel.y4m # yuv444, uncompressed. mplayer gets the colors wrong?
2342M qtrle.mkv # encode went at 16fps, so qtrle is slower and worse filesize
2105M sintel.huff.mkv # ffvhuff with default options, rgb pix fmt
1228M sintel.utvideo.mkv # muxed without audio, I should update the others this way
946M png-copy.mkv # -codec copy makes a MPNG stream. Use -codec png for non-png sources, but it won't make PNGs as small. Decodes very fast
824M lossy.prores_ks.mov # yuv444p10le extremely slow to encode (2.3fps), and worse bitrate.
816M frompng.sintel.264rgb.mkv
735M sintel.x264rgb.medium.nocabac.mkv # encode went at 3.3 fps instead of 18. Better gain than for live-action, though
626M sintel_trailer.rgb.lossless.veryslow.mkv # 1.1fps. With CABAC, 16 ref frames, etc. etc.
512M lossy.prores.mov # yuv422p10le, 12fps
341M sintel.yuv420.x264.lossless.mkv
21M lossy.rgb.crf26.preset=medium.mkv
13M lossy.yuv420.crf26.preset=medium.mkv # remember this is WITH 4.5MB audio
Beachten Sie, dass mediainfo
nicht über RGB h.264 Bescheid wissen und dass es sich bei den Dateien immer noch um YUV handelt.
Überprüfen Sie, ob es wirklich verlustfrei war:
ffmpeg -i 1080/sintel_trailer_2k_%4d.png -f framemd5 png.framemd5
ffmpeg -i fromhuff.sintel.264rgb.mkv -an -sn -pix_fmt rgb24 -f framemd5 x264rgb.framemd5
diff -s *.framemd5
Files png.framemd5 and x264rgb.framemd5 are identical
Auf diese Weise können Sie die ursprüngliche PNG-Eingabe wiederherstellen, dh Sie können PNGs mit identischen Bilddaten erstellen.
Beachten Sie die -pix_fmt rgb24
für den x264-Test. Der h.264-Decoder von ffmpeg gibt eine gbrp-Ausgabe (planar, nicht gepackt) aus, sodass die Bits identisch sind, jedoch in einer anderen Reihenfolge. Der "Container" von framemd5 unterwirft keinerlei Formatbeschränkungen, aber Sie erhalten nur dann das gleiche md5, wenn die Bits gleich angeordnet sind. Ich habe mir gerade angesehen, was ffmpeg für eine pix fmt verwendet, als ich es mit PNGs fütterte, und das dann als Argument verwendet-pix_fmt
für die Dekodierung verwendet habe. Dies ist übrigens der Grund, warum vlc keine RGB h.264-Dateien wiedergibt (bis zur nächsten Veröffentlichung oder bei aktuellen nächtlichen Builds): Das gbrp-Pixelformat wird nicht unterstützt.
Für yuv Gebrauch libx264
nicht libx264rgb
. Sie müssen keine RGB-Version von x264 installieren, die eigentliche Bibliothek unterstützt beides. Es ist nur ffmpeg, das es als zwei unterschiedlich benannte Encoder implementiert hat. Ich denke, wenn sie das nicht getan hätten, wäre das Standardverhalten, die rgb-Eingabe als rgb zu belassen und sehr langsam zu laufen, während sie eine viel höhere Bitrate für die gleiche Qualität produzieren. (du musst noch manchmal verwenden, -pix_fmt yuv420p
wenn du 420
statt 444
h.264 ausgabe willst.
Sofern Sie keine Dateien für die Langzeitspeicherung erstellen, sollten Sie immer -preset ultrafast
verlustfreies x264 verwenden. Mehr Referenzbilder und Bewegungssuche machen kaum einen Unterschied für verlustfreies, für nicht animiertes Material mit jeglichem Rauschen. CABAC benötigt eine große Menge an CPU bei verlustfreien Bitraten, sogar zum Dekodieren. Nur für Archivierungszwecke verwenden, keine Scratch-Dateien. (Ultraschnell deaktiviert CABAC). CABAC spart 10 bis 15% Bitrate.
Wenn Sie möchten, dass jeder Frame ein Keyframe ist, legen Sie fest -keyint 1
. Dann wird Sie die Videobearbeitungssoftware nicht einschränken, die nur Keyframes bearbeiten oder schneiden möchte.
So beantworten Sie die ursprüngliche Frage: Gehen Sie wie folgt vor, um temporäre Dateien zu durchsuchen, während Sie schrittweise vorgehen (z. B. ein langsames Deinterlace, das verlustfreie Ausgabe speichert, bevor Sie andere Vorgänge ausführen):
ffmpeg -i dv-video-source.ts -vf yadif=2:1,mcdeint=3:1:10 -c:a copy -c:v libx264 -preset ultrafast -qp 0 deinterlaced.mkv
Wenn Sie wirklich eine Ausgabe in Bilddateien benötigen, die Sie mit Standbild-Tools bearbeiten können, dekodieren Sie diese unbedingt in png. Sie werden nicht mehr als das niedrigstwertige der 8 Bits für jeden der Y-, Cb- und Cr-Werte für jedes Pixel verlieren.
x264 kommt hier WIRKLICH gut heraus, weil es viele schwarze Rahmen mit ein bisschen Text, ein Ein- und Ausblenden und eine perfekte Ähnlichkeit zwischen großen Bereichen vieler Rahmen gibt, die es sogar ausnutzt -preset ultrafast
. Bei Live-Action sehe ich immer noch x264 mit der halben Dateigröße von ffvhuff (yuv420).
Für alle Neugierigen: Die verlustfreie rgb-Kodierung mit hoher CPU-Zeit hatte (x264 core 144 r2525):
[libx264rgb @ 0x35b97a0] frame I:27 Avg QP: 0.00 size:604367
[libx264rgb @ 0x35b97a0] frame P:1226 Avg QP: 0.00 size:517512
[libx264rgb @ 0x35b97a0] mb I I16..4..PCM: 46.3% 38.1% 15.7% 0.0%
[libx264rgb @ 0x35b97a0] mb P I16..4..PCM: 24.3% 5.4% 4.5% 0.0% P16..4: 10.5% 3.3% 5.7% 0.0% 0.0% skip:46.3%
[libx264rgb @ 0x35b97a0] 8x8 transform intra:17.3% inter:46.1%
[libx264rgb @ 0x35b97a0] coded y,u,v intra: 81.6% 77.5% 80.0% inter: 28.0% 27.7% 28.1%
[libx264rgb @ 0x35b97a0] i16 v,h,dc,p: 35% 64% 1% 0%
[libx264rgb @ 0x35b97a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 49% 13% 2% 1% 1% 1% 1% 1%
[libx264rgb @ 0x35b97a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 31% 37% 5% 5% 6% 5% 5% 4% 3%
[libx264rgb @ 0x35b97a0] Weighted P-Frames: Y:41.1% UV:40.7%
[libx264rgb @ 0x35b97a0] ref P L0: 74.5% 4.2% 9.1% 4.1% 2.1% 1.7% 1.2% 0.8% 0.6% 0.5% 0.3% 0.2% 0.2% 0.2% 0.2% 0.1%
[libx264rgb @ 0x35b97a0] kb/s:99721.66
Beachten Sie den sehr hohen Anteil an gewichteten p-Frames und auch den sehr hohen Anteil an überspringenden Makroblöcken. Jeder Szenenübergang ist eine Überblendung, kein Schnitt, und x264 nutzt den Vorteil, wenn Sie der CPU Zeit geben, um herauszufinden, wie.
Weitere Hinweise (verlustbehaftete Codecs zum Bearbeiten):
Für das Scrubben vorwärts / rückwärts durch Clips werden in der Regel ausschließlich interne Codecs bevorzugt (utvideo, ffvhuff, mjpeg, jpeg2000, pro-res, AVC-Intra). Ich würde mir vorstellen, dass reguläre AVCs mit kurzen GOPs (1/2 bis 1 Sek.) Auch ziemlich gut scrubben würden, solange die Software wusste, was sie tat ein Zwischenbild, wenn Sie auf einer Timeline so stark vergrößert sind, dass dies erforderlich ist).
Ich habe hier und unter https://video.stackexchange.com/ einige negative Dinge über Pro-Res gepostet , z. B. "Was nützt es, wenn die Komprimierung langsamer und schlechter ist als bei einem verlustfreien Codec", aber es hat einige interessante Funktionen. Apple gibt an, dass es mit einer halben Auflösung dekodieren kann, wobei nur 1/3 der CPU-Zeit für die Dekodierung in voller Auflösung benötigt wird.
Die Implementierung von ffmpegs Prores ist wahrscheinlich auch nicht so schnell wie die von Apple, weshalb meine Tests mit ffmpeg es langsam aussehen ließen. Es lohnt sich wahrscheinlich nicht, einen kostenlosen Software-Workflow mit ffmpeg-basierten Tools zu verwenden, aber es lohnt sich möglicherweise, ihn zu testen, wenn Sie kommerzielle Software verwenden.
Ich mache nicht viel Videobearbeitung, meistens nur Codierung, daher weiß ich nicht genau, welche Tests für Codecs wie Prores geeignet sind. Ich würde vermuten, dass mjpeg vielleicht eine gute schnelle Alternative wäre, wenn Short-GOP x264 nicht gut funktioniert. Es gibt asm-beschleunigte Implementierungen von JPEG in Linux-Distributionen und es ist ein ziemlich einfacher Codec. Sie können die Qualität nach Bedarf erhöhen oder verringern, um den Kompromiss zwischen Qualität und Dateigröße sowie Kodierungs- / Dekodierungsgeschwindigkeit zu finden. Es ist uralt, aber wenn Sie einen Nur-Intra-Codec möchten, der wirklich schnell ist, schlägt er möglicherweise x264.
Für x264 würde ich so etwas versuchen x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(nur intern, ohne die anderen Einstellungen --avcintra-class
). Hinweis superfast
(ohne CABAC), oder faster
, ultrafast
ist wahrscheinlich nicht am besten für den verlustbehafteten Betrieb. Ich denke, ultraschnell verliert viel an Qualität, ohne viel schneller zu sein. Je niedriger die Qualität (höhere crf), desto mehr CPU-Zeit muss aufgewendet werden, um eine bessere Kodierung zu finden. Vieles davon ist jedoch bei einer GOP-Größe von 1 wahrscheinlich nicht relevant.
Wenn Sie bei einer GOP-Größe> 1 so viele Bits in die Codierung werfen, dass eine bessere Inter-Vorhersage beim Codieren der Residuen nicht viele Bits einspart (weil Rauschen / Körnung / subtile Änderungen zwischen Frames sehr genau erhalten bleiben), dann einfach superschnell ist wohl in ordnung. Andernfalls wäre mit --keyint=30
oder etwas wahrscheinlich --preset veryfast --crf 12
interessant.
Theoretisch sollte die Qualität bei einer bestimmten CRF-Einstellung in allen Presets konstant sein. Wenn Sie nach kleineren Dateien suchen (schnellere Dekodierung), ist es sinnvoll, einige Qualitätsmerkmale und einige Zeit für die Kodierung abzuwägen.
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
.