Böylece çok uzun bir süre kendi cevabımı verdim.
TL; DR özeti: kayıpsız görüntüler, kullanım dizisi depolamak için libx264
veya libx264rgb
birlikte -preset ultrafast -qp 0
. Neredeyse ffvhuff kadar hızlı, daha düşük bit hızı ile ve daha hızlı kod çözüyor. huffyuv
ffmpeg dışında daha yaygın olarak desteklenir, ancak birçok piksel biçimini desteklemez ffvhuff
. Bu nedenle, diğer araçlarınızın High 4:4:4 Predictive
x264'ün kayıpsız modda kullandığı h.264 profilini idare edebileceğini varsayarsak, h.264'ü kullanmanın bir başka nedeni de budur . x264 yalnızca rasgele çerçevelere hızlı rasgele erişime ihtiyaç duyulursa intra yapabilir.
Bir resim dizinden okurken libx264rgb'yi etkileyen ffmpeg hatalarına dikkat edin . (ve başka hangi davaları kim bilir?) Kullanmadan önce kurulumunuzdaki kayıpsızlığı test edin. ( ffmpeg -i in -pix_fmt rgb24 -f framemd5
kaynağında kolay ve kayıpsız sıkıştırılmış)
edit: utvideo
oldukça hızlı kodlar ve kodları çözer ve h.264'ten çok daha basit bir codec bileşenidir. huffyuv
Daha kullanışlı renk alanlarını destekleyen, temelde modern . H.264 ile ilgili bir problem yaşarsanız, geçici dosyalar için sonraki utvideo'yu deneyin.
edit2: Bir RGB kodeki olarak PNG, en azından Sintel fragmanında başarılı görünüyor.
Ayrıca bkz: benzer bir soruya benzer cevabım:
https://superuser.com/a/860335/20798
Warren Young'ın çeşitli ham biçimler ve codec bileşenleri hakkındaki cevabında birçok bilgi var. Cevap daha kısa olsaydı daha faydalı olacağını düşünüyorum, bu yüzden yeni bir cevap veriyorum. Kayıpsız x264 veya ffvhuff'ı desteklemeyen bir yazılımla çalışıyorsanız, bu bilgilerin bazıları muhtemelen hala kullanışlıdır.
Bu bağlamda "kayıpsız" en kullanışlı tanımı bit için bit girişini kurtarabilmenizdir. Sıfır, ne yaptığınıza bakılmaksızın, video kodlamasından kalite kalitesinin düşmesi konusunda endişelenmeyin.
http://en.wikipedia.org/wiki/Chroma_subsampling
İdeal olarak, çok sayıda renk alanı dönüşümünden kaçının. Yuvarlama hataları potansiyel olarak birikebilir. Videonuzda RGB renk alanında çalışan filtrelerle çalışacaksanız, daha yüksek bit hızları sorun olmadığı sürece, RGB’yi tutmak mantıklı olacaktır. Muhtemelen nihayetinde bir yuv 4:2:0
video üreteceksiniz , ancak ekstra kroma çözünürlüğünü korumak, hangi filtreleri uygulayacağınıza bağlı olarak potansiyel olarak faydalıdır.
Her iki durumda da kayıpsız x264 ve destek RGB ve YUV hem ffvhuff 4:4:4
, 4:2:2
ve 4:2:0
. Çözülmesi hızlı olduğu için x264'i önerebilirim. RGB HD videoyu gerçek zamanlı olarak oynatmaya çalışıyorsanız, xv yerine opengl'i deneyin, çünkü sistemimdeki xv yalnızca yuvayı kabul ediyor. mplayer, renk alanı dönüşümü yapmak için fazladan CPU zamanı alıyordu.
Aşağıdaki kodlayıcı testlerinin kaynağı: https://media.xiph.org/ . https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz Sintel fragmanının y4m dosyalarını gziplemeyi unuttular, bu yüzden png tarball aslında çok daha küçük.
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
Örneğin
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
Fps belirtmeyi unuttuğumu unutmayın -r 24
, böylece ses ile av eşitlenmez. (ve bit hızı (ancak dosya boyutu değil) sayıları da kapalı olacaktır. ffmpeg varsayılanları 25fps'dir). Bu makinedeki işlemci, 1. nesil (conroe) core2duo 2.4GHz'dir (E6600).
Sonuçlar:
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
Not mediainfo
RGB h.264 bilmediği, hala dosyaları YUV olduğunu söyler.
Gerçekten kayıpsız olduğunu kontrol edin:
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
Böylece orijinal PNG girişini bu şekilde geri kazanabilirsiniz, yani PNG'leri içlerinde aynı görüntü verisiyle yapabilirsiniz.
-pix_fmt rgb24
X264 testi için not alın . ffmpeg'in h.264 kod çözücüsü gbrp (düzlemsel, paketlenmemiş) çıktı üretir, bu nedenle bitler aynıdır, ancak farklı bir sıradadır. Framemd5 "container" herhangi bir format kısıtlaması getirmez, ancak bitler aynı şekilde düzenlenirse yalnızca aynı md5'i alırsınız. PNG'leri beslerken ffmpeg'in bir pix fmt için kullandığını söylediği şeye baktım, sonra bunu -pix_fmt
çözmek için argüman olarak kullandım . Bu arada, vlc'nin RGB h.264 dosyalarını oynatmamasının nedeni budur (bir sonraki sürüme kadar veya geçerli gece oluşturma işlemine kadar): gbrp piksel biçimini desteklemez.
Yuva kullanımı için libx264
değil libx264rgb
. Bir x264 RGB sürümü kurmanıza gerek yok, gerçek kütüphane her ikisini de destekliyor. İki farklı kodlayıcı olarak uygulayan sadece ffmpeg. Bunu yapmamışlarsa, varsayılan davranış, rgb girişini rgb olarak bırakmak ve aynı kalite için çok daha yüksek bit hızı çıktısı üretirken gerçekten yavaş çalıştırmak olacaktır. (Hala bazen kullanımına sahip -pix_fmt yuv420p
İsterseniz 420
yerine 444
h.264 çıktı.
Uzun süreli depolama için dosyalar oluşturmazsanız, daima -preset ultrafast
kayıpsız x264 için kullanın . Daha fazla referans çerçevesi ve hareket arama özelliği, animasyonlu olmayan malzemeler için herhangi bir gürültüyle kayıpsız olarak neredeyse hiç farketmez. CABAC, şifresini çözmek için bile kayıpsız bit oranlarında büyük miktarda CPU alır. Dosyaları arşivlemek için yalnızca arşivleme amacıyla kullanın. (ultrafast CABAC'ı devre dışı bırakır). CABAC% 10-15 oranında bitrate tasarrufu sağlar.
Her karenin bir anahtar kare olması için ihtiyacınız varsa ayarlayın -keyint 1
. O zaman sadece ana kareleri kesmek isteyen veya w / e yapmak isteyen video düzenleme yazılımı sizi sınırlandırmaz.
Asıl soruyu cevaplamak için: Aşamaları denerken geçici dosyaları atmak için yapmanız gereken şey budur (örn. Yavaş bir deinterlace, başka şeyleri denemeden önce kayıpsız çıktı tasarrufu):
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
Çıktınıza hareketsiz görüntü araçlarıyla değiştirebileceğiniz görüntü dosyalarında gerçekten ihtiyaç duyuyorsanız, png komutunun kodunu çıkartın. Her piksel için Y, Cb ve Cr değerlerinin her birinin 8 bitinden en az önemlisi olandan daha fazlasını hiçbir şey kaybetmeyeceksiniz.
x264 gerçekten çok iyi bir şekilde çıkıyor çünkü bir miktar metin içeren çok sayıda siyah çerçeve, bir solma ve solma ve birçok karenin büyük alanları arasında bile bundan faydalanmayı sağlayan mükemmel bir benzerlik var -preset ultrafast
. Canlı-eylemde, hala ffvhuff dosyalarının yarısında x264'ü görüyorum (yuv420).
Merak eden herkes için: Yüksek cpu-zaman kayıpsız rgb kodlaması vardı (x264 çekirdek 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
Gerçekten ağırlıklı p karelerinin çok yüksek oranını ve ayrıca atlama makro bloklarının çok yüksek oranını not alın. Her sahne geçişi bir soluktur, kesim değildir ve nasıl yapılacağını anlamak için CPU zamanını verirseniz x264 avantaj sağlar.
ek notlar (düzenleme için kayıplı kodekler):
Klipler yoluyla ileri / geri fırçalamak için, sadece içi kod çözücüler genellikle tercih edilir (utvideo, ffvhuff, mjpeg, jpeg2000, pro-res, AVC-Intra). Yazılımın ne yaptığını bildiği sürece kısa GOP'lerin (1/2 ila 1 sn) normal AVC'yi iyi bir şekilde fırçalayacağını hayal ediyorum (hızlı fırçalarken en yakın I çerçevesini deşifre etmek, GOP içinde çözmek İhtiyaç duyulacak bir zaman çizelgesinde yeterince yakınlaştırılmışsanız, ara çerçeve).
Bu konuda bazı olumsuz şeyler yayınladım ve " https://video.stackexchange.com/ pro-res hakkında," kayıpsız bir kodlayıcıya göre daha yavaş ve daha kötü bir sıkıştırma varsa, sorun ne olabilir "gibi, ancak bazı ilginç özelliklere sahip. Apple, tam rez çözme işleminin 1 / 3'ü kadar küçük bir işlemle yarım çözünürlükte çözülebileceğini söylüyor .
ffmpeg'in prores uygulaması muhtemelen Apple'ın hızı kadar optimize edilmedi, bu yüzden ffmpeg ile yaptığım testler yavaş görünüyor. Ffmpeg tabanlı araçlarla bir Ücretsiz yazılım iş akışınız varsa muhtemelen kullanmaya değmez, ancak ticari yazılım kullanıyorsanız denemeye değer olabilir.
Çok fazla video düzenleme işlemi yapmıyorum, çoğunlukla sadece kodlama yapıyorum, bu yüzden prores gibi kodekler için hangi testlerin uygun olacağı konusunda hiçbir fikrim yok. Kısa GOP x264 iyi çalışmıyorsa, belki de mjpeg'in hızlı bir alternatif olabileceğini tahmin ediyorum. Linux dağıtımlarında, hızlandırılmış jpeg uygulamaları var ve bu oldukça basit bir codec bileşeni. Kaliteyi düşürmek için dosya boyutuna göre kod çözme / kod çözme hızını düşürmek için kaliteyi yukarı veya aşağı çevirebilirsiniz. Eski, ancak gerçekten hızlı olan yalnızca bir intra-codec bileşeni istiyorsanız, x264'ü yenebilir.
X264 için şöyle bir şey denerdim x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(yalnızca Intra-yalnızca, --avcintra-class
ayarlayan başka hiçbir şey olmadan .) Not superfast
(CABAC olmadan), ya da muhtemelen kayıplı işlem için en iyisi faster
değil ultrafast
. Bence ultrafast bu kadar hızlı olmadan çok fazla kalite kaybeder. Ne kadar düşük kalite (yüksek crf) kullanırsanız, o kadar iyi bir kodlama bulmak için biraz daha CPU harcıyorsunuz. Bununla birlikte, bunların çoğu muhtemelen GOP büyüklüğü = 1 ile ilişkili değildir.
GOP büyüklüğü> 1 olduğunda, kodlamaya çok daha fazla bit atıyorsanız, daha iyi tahminler artıkları kodlarken daha fazla bit tasarruf etmeyecektir (çünkü çerçeveler arasındaki gürültü / tahıl / ince değişiklikler çok doğru bir şekilde korunur), sadece süper hızlı muhtemelen iyidir. Aksi takdirde, ile --keyint=30
veya bir şey, muhtemelen --preset veryfast --crf 12
ilginç olurdu.
Teoride, verilen bir CRF ayarındaki kalite ön ayarlarda sabit olmalıdır. Daha küçük dosyalar (daha hızlı kod çözme) arıyorsanız, bir miktar işlem yapın ve bir miktar kodlama süresi mantıklı geliyor.
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
.