Skończyło się więc na tym, że moja odpowiedź była zbyt długa.
Podsumowanie TL; DR: Do bezstratnego przechowywania sekwencji obrazów użyj libx264
lub libx264rgb
z -preset ultrafast -qp 0
. Jest prawie tak szybki jak ffvhuff, ze znacznie mniejszą przepływnością i dekoduje szybciej. huffyuv
jest znacznie szerzej obsługiwany poza ffmpeg, ale nie obsługuje tylu formatów pikseli, jak ffvhuff
. To kolejny powód, aby używać h.264, zakładając, że twoje inne narzędzia mogą obsługiwać High 4:4:4 Predictive
profil h.264, z którego korzysta x264 w trybie bezstratnym. x264 może wykonywać tylko wewnątrz, jeśli potrzebny jest szybki losowy dostęp do dowolnych ramek.
Uważaj na błąd ffmpeg, który wpływa na libx264rgb podczas czytania z katalogu obrazów. (i kto wie, jakie inne przypadki.) Przed użyciem sprawdź, czy w konfiguracji nie ma strat. (łatwe ffmpeg -i in -pix_fmt rgb24 -f framemd5
w źródle i bezstratnie skompresowane))
edit: utvideo
koduje i dekoduje dość szybko i jest znacznie prostszym kodekiem niż h.264. Jest to w zasadzie nowoczesny huffyuv
, z obsługą bardziej przydatnych przestrzeni kolorów. Jeśli kiedykolwiek masz problem z h.264, spróbuj utvideo next dla plików tymczasowych.
edit2: PNG jako kodek RGB wydaje się dobrze, przynajmniej w zwiastunie Sintel.
Zobacz także moją podobną odpowiedź na podobne pytanie:
https://superuser.com/a/860335/20798
W odpowiedzi Warrena Younga znajduje się wiele informacji na temat różnych surowych formatów i kodeków. Myślę, że odpowiedź byłaby bardziej przydatna, gdyby była krótsza, więc piszę nową odpowiedź. Jeśli pracujesz z oprogramowaniem, które nie obsługuje bezstratnego x264 lub ffvhuff, niektóre z tych informacji prawdopodobnie nadal są przydatne.
Najbardziej użyteczną definicją „bezstratnego” w tym kontekście jest to, że można odzyskać wejściowy bit po bicie. Bez obaw o pogorszenie jakości kodowania wideo, niezależnie od tego, co robisz.
http://en.wikipedia.org/wiki/Chroma_subsampling
Najlepiej unikać wielu konwersji przestrzeni kolorów. Błędy zaokrąglania mogą potencjalnie narastać. Jeśli zamierzasz operować na swoim filmie z filtrami, które działają w przestrzeni kolorów RGB, wówczas utrzymanie go w RGB ma sens, o ile wyższe prędkości transmisji nie stanowią problemu. Prawdopodobnie zamierzasz ostatecznie stworzyć yuv 4:2:0
film, ale utrzymanie dodatkowej rozdzielczości barwy jest potencjalnie przydatne, w zależności od filtrów, które zamierzasz zastosować.
Tak czy inaczej, bezstratny x264 i ffvhuff zarówno wsparcie RGB i YUV 4:4:4
, 4:2:2
oraz 4:2:0
. Sugerowałbym x264, ponieważ szybko dekoduje. Jeśli próbujesz odtwarzać wideo RGB HD w czasie rzeczywistym, spróbuj opengl zamiast xv, ponieważ xv w moim systemie akceptuje tylko wejście yuv. mplayer poświęcił więcej czasu procesorowi na konwersję przestrzeni kolorów.
Źródło następujących testów kodera: https://media.xiph.org/ . https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz Zapomnieli zgzipować pliki y4m dla przyczepy sintel, więc tarball png jest w rzeczywistości dużo mniejszy.
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
na przykład
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
Pamiętaj, że zapomniałem podać -r 24
fps, więc nie będzie synchronizował av z dźwiękiem. (a liczby bitrate (ale nie rozmiar pliku) również będą wyłączone. ffmpeg domyślnie wynosi 25 fps). Procesor w tej maszynie to rdzeń pierwszej generacji (conroe) 2,2 GHz 2,4 GHz (E6600).
wyniki:
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
Zauważ, że mediainfo
nie wie o RGB h.264, nadal mówi, że pliki to YUV.
Sprawdź, czy to naprawdę było bezstratne:
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
Możesz w ten sposób odzyskać oryginalne dane wejściowe PNG, tzn. Możesz tworzyć pliki PNG z identycznymi danymi obrazu.
Zwróć -pix_fmt rgb24
uwagę na test x264. Dekoder h.264 ffmpeg wyprowadza wyjście gbrp (planarne, niepakowane), więc bity są takie same, ale w innej kolejności. „Kontener” framemd5 nie nakłada żadnych ograniczeń formatowania, ale dostaniesz ten sam md5 tylko wtedy, gdy bity są ułożone w ten sam sposób. Właśnie spojrzałem na to, co ffmpeg powiedział, że używa go do pix fmt, kiedy karmiłem go PNG, a następnie użyłem tego jako argumentu do -pix_fmt
dekodowania. Nawiasem mówiąc, z tego powodu vlc nie będzie odtwarzać plików RGB h.264 (do następnej wersji lub bieżących kompilacji nocnych): nie obsługuje formatu pikseli gbrp.
YUV do użytku libx264
, nie libx264rgb
. Nie musisz instalować wersji x264 RGB, rzeczywista biblioteka obsługuje obie te funkcje. Po prostu ffmpeg zaimplementował go jako dwa enkodery o różnych nazwach. Myślę, że gdyby tego nie zrobili, domyślnym zachowaniem byłoby pozostawienie wejścia rgb jako rgb i działanie bardzo wolno, przy jednoczesnym generowaniu znacznie wyższej wydajności bitrate dla tej samej jakości. (Nadal czasami musisz użyć, -pix_fmt yuv420p
jeśli chcesz 420
zamiast 444
wyjścia h.264.
O ile nie tworzysz plików do przechowywania długoterminowego, zawsze używaj -preset ultrafast
bezstratnego x264. Więcej ramek referencyjnych i wyszukiwania ruchu nie ma większego znaczenia dla bezstratnego, nie-animowanego materiału z dowolnym hałasem. CABAC wymaga ogromnej ilości procesora przy bezstratnej przepływności, nawet do dekodowania. Używaj tylko do celów archiwalnych, a nie do rysowania plików. (ultrafast wyłącza CABAC). CABAC zapewnia 10 do 15% oszczędności bitrate.
Jeśli potrzebujesz, aby każda klatka była klatką kluczową, ustaw -keyint 1
. Oprogramowanie do edycji wideo, które chce wycinać tylko klatki kluczowe lub w / e, nie będzie Cię ograniczać.
Aby odpowiedzieć na pierwotne pytanie: Oto, co powinieneś zrobić, aby ominąć pliki tymczasowe podczas próbowania rzeczy etapami (np. Powolne usuwanie przeplotu, zapisywanie bezstratnego wyjścia przed próbowaniem innych rzeczy):
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
Jeśli naprawdę potrzebujesz danych wyjściowych w plikach graficznych, które możesz modyfikować za pomocą narzędzi do zdjęć, to koniecznie zdekoduj do formatu png. Nie stracisz nic więcej niż być może najmniej znaczącego z 8 bitów dla każdej wartości Y, Cb i Cr dla każdego piksela.
x264 wyjdzie NAPRAWDĘ dobrze, ponieważ jest tam wiele czarnych ramek z odrobiną tekstu, ściemnianie i ściemnianie oraz doskonałe podobieństwo między dużymi obszarami wielu ramek, z których udaje mu się skorzystać nawet przy -preset ultrafast
. Podczas akcji na żywo nadal widzę x264 w rozmiarze połowy pliku ffvhuff (yuv420).
Dla każdego, kto jest ciekawy: bezstratny kodowanie rgb w wysokim czasie procesora miało (rdzeń x264 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
Zwróć uwagę na naprawdę dużą część ważonych ramek p, a także naprawdę dużą część pomijanych makrobloków. Każde przejście sceny jest zanikaniem, a nie cięciem, a x264 wykorzystuje przewagę, jeśli poświęcisz czas procesorowi, aby dowiedzieć się, jak to zrobić.
dalsze uwagi (kodeki stratne do edycji):
Do przewijania klipów do przodu / do tyłu zwykle preferowane są kodeki wewnętrzne (utvideo, ffvhuff, mjpeg, jpeg2000, pro-res, AVC-Intra). Wyobrażam sobie, że zwykłe AVC z krótkimi GOP (1/2 do 1 s) szoruje również całkiem dobrze, o ile oprogramowanie wie, co robi (dekodowanie najbliższej klatki I podczas szybkiego szorowania, dekodowanie w GOP, aby dostać się do między klatkami, jeśli jesteś wystarczająco powiększony na osi czasu, aby to było potrzebne).
Opublikowałem na ten temat kilka negatywnych rzeczy i https://video.stackexchange.com/ na temat pro-res, np. „O co chodzi, jeśli kompresja jest wolniejsza i gorsza niż bezstratny kodek”, ale ma kilka interesujących funkcji. Apple twierdzi , że może dekodować w połowie rozdzielczości, używając zaledwie 1/3 czasu procesora do dekodowania pełnej rez.
Implementacja prores ffmpeg prawdopodobnie nie jest tak zoptymalizowana pod kątem szybkości jak Apple, dlatego moje testy z ffmpeg sprawiły, że wygląda to wolniej. Prawdopodobnie nie warto go używać, jeśli masz przepływ pracy Wolnego oprogramowania z narzędziami opartymi na ffmpeg, ale warto spróbować, jeśli używasz komercyjnego oprogramowania.
Nie robię dużo edycji wideo, głównie tylko kodowania, więc nie mam pojęcia, jakie testy byłyby odpowiednie dla kodeków takich jak prory. Domyślam się, że może mjpeg byłby dobrą szybką alternatywą, jeśli short-GOP x264 nie działa dobrze. W dystrybucjach Linuksa są przyspieszone asm implementacje jpeg i jest to dość prosty kodek. Możesz w razie potrzeby zwiększyć lub zmniejszyć jakość, aby obniżyć jakość w porównaniu do rozmiaru pliku + prędkości kodowania / dekodowania. Jest starożytny, ale jeśli chcesz bardzo szybki kodek wewnątrz-wewnętrzny, może pobić x264.
W przypadku x264 spróbowałbym czegoś takiego x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(tylko wewnątrz, bez innych ustawionych elementów --avcintra-class
). Uwaga superfast
(bez CABAC), lub faster
, ultrafast
prawdopodobnie nie jest najlepszy do operacji stratnych. Myślę, że ultraszybka utrata jakości nie jest o wiele szybsza. Im niższa jakość (wyższa CRF), tym bardziej warto poświęcić nieco więcej czasu procesora na znalezienie lepszego kodowania. Jednak wiele z tego prawdopodobnie nie ma znaczenia przy rozmiarze GOP = 1.
Przy rozmiarze GOP> 1, jeśli rzucasz tyle bitów w kodowanie, że lepsza inter-predykcja nie uratuje wielu bitów podczas kodowania reszt (ponieważ szum / ziarno / subtelne zmiany między ramkami są zachowywane bardzo dokładnie), to po prostu superszybki jest prawdopodobnie w porządku. W przeciwnym razie, z --keyint=30
czymś, prawdopodobnie --preset veryfast --crf 12
byłoby interesujące.
Teoretycznie jakość przy danym ustawieniu CRF powinna być stała dla wszystkich ustawień wstępnych. Jeśli szukasz mniejszych plików (szybsze dekodowanie), warto wymienić trochę jakości i trochę czasu kodowania.
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
.