Jadi saya akhirnya membuat jawaban sendiri terlalu lama.
Ringkasan TL; DR: Untuk menyimpan secara berurutan urutan gambar, gunakan libx264
atau libx264rgb
dengan -preset ultrafast -qp 0
. Ini hampir secepat ffvhuff, dengan bitrate jauh lebih rendah, dan menerjemahkan lebih cepat. huffyuv
jauh lebih banyak didukung di luar ffmpeg, tetapi tidak mendukung format piksel sebanyak ffvhuff
. Jadi itulah alasan lain untuk menggunakan h.264, dengan asumsi alat Anda yang lain dapat menangani High 4:4:4 Predictive
profil h.264 yang digunakan x264 dalam mode lossless. x264 dapat melakukan intra-saja jika akses acak cepat ke frame sewenang-wenang diperlukan.
Waspadalah terhadap bug ffmpeg yang memengaruhi libx264rgb saat membaca dari direktori gambar. (dan siapa yang tahu kasus apa lagi.) Tes untuk losslessness dalam pengaturan Anda sebelum menggunakan. (mudah dengan ffmpeg -i in -pix_fmt rgb24 -f framemd5
sumber dan lossless-kompresi))
sunting: utvideo
menyandikan dan menerjemahkan dengan cukup cepat, dan merupakan codec yang lebih sederhana daripada h.264. Ini pada dasarnya modern huffyuv
, dengan dukungan untuk ruang warna yang lebih berguna. Jika Anda pernah memiliki masalah dengan h.264, coba utvideo selanjutnya untuk file sementara.
sunting2: PNG sebagai RGB codec tampaknya berfungsi dengan baik, setidaknya di trailer Sintel.
Lihat juga jawaban saya yang mirip dengan pertanyaan serupa:
https://superuser.com/a/860335/20798
Ada banyak info dalam jawaban Warren Young tentang berbagai format dan codec mentah. Saya pikir jawabannya akan lebih berguna jika lebih pendek, jadi saya membuat jawaban baru. Jika Anda bekerja dengan perangkat lunak yang tidak mendukung x264 lossless atau ffvhuff, maka beberapa info itu mungkin masih berguna.
Definisi yang paling berguna dari "lossless" dalam konteks ini adalah Anda dapat memulihkan input bit-for-bit. Nol khawatir tentang penurunan kualitas dari penyandian video, apa pun yang Anda lakukan.
http://en.wikipedia.org/wiki/Chroma_subsampling
Idealnya, hindari beberapa konversi spasi warna. Kesalahan pembulatan berpotensi menumpuk. Jika Anda akan beroperasi pada video Anda dengan filter yang berfungsi di ruang warna RGB, maka pertahankan RGB masuk akal, selama bitrate yang lebih tinggi tidak menjadi masalah. Anda mungkin pada akhirnya akan menghasilkan yuv 4:2:0
video, tetapi menjaga resolusi kroma ekstra berpotensi berguna, tergantung pada filter apa yang akan Anda terapkan.
Either way, lossless x264 dan ffvhuff baik dukungan RGB dan YUV 4:4:4
, 4:2:2
, dan 4:2:0
. Saya sarankan x264, karena cepat untuk memecahkan kode. Jika Anda mencoba memutar video RGB HD secara realtime, coba buka bukan xv, karena xv pada sistem saya hanya menerima input yuv. mplayer membutuhkan waktu CPU ekstra untuk melakukan konversi ruang-warna.
Sumber untuk tes enkoder berikut: https://media.xiph.org/ . https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz Mereka lupa untuk gzip file y4m untuk trailer sintel, sehingga tarball png sebenarnya jauh lebih kecil.
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
misalnya
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
Perhatikan bahwa saya lupa menentukan -r 24
fps, sehingga av tidak akan tetap menyinkronkan dengan audio. (dan angka bitrate (tetapi bukan ukuran file) juga akan mati. ffmpeg default ke 25fps). CPU dalam mesin ini adalah 1st-gen (conroe) core2duo 2.4GHz (E6600).
hasil:
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
Catatan yang mediainfo
tidak tahu tentang RGB h.264, masih mengatakan bahwa file tersebut adalah YUV.
Periksa apakah benar-benar lossless:
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
Jadi Anda dapat memulihkan input PNG asli dengan cara itu, yaitu Anda dapat membuat PNG dengan data gambar yang identik di dalamnya.
Perhatikan -pix_fmt rgb24
untuk tes x264. dekoder h.264 ffmpeg menghasilkan keluaran gbrp (planar, tidak dikemas), sehingga bitnya sama, tetapi dalam urutan yang berbeda. Framemd5 "container" tidak mengenakan batasan format apa pun, tetapi Anda hanya akan mendapatkan md5 yang sama jika bit-bitnya disusun dengan cara yang sama. Saya baru saja melihat apa yang dikatakan ffmpeg digunakan untuk pix fmt ketika saya memberinya PNG, kemudian menggunakannya sebagai argumen -pix_fmt
untuk decode. Kebetulan, inilah alasan vlc tidak akan memutar file RGB h.264 (sampai rilis berikutnya, atau build malam hari ini): Ini tidak mendukung format gbrp pixel.
Untuk Anda gunakan libx264
, bukan libx264rgb
. Anda tidak perlu menginstal versi RGB x264, pustaka yang sebenarnya mendukung keduanya. Hanya ffmpeg yang mengimplementasikannya sebagai dua encoders yang dinamai berbeda. Saya pikir jika mereka tidak melakukan itu, perilaku default adalah meninggalkan input rgb sebagai rgb, dan berjalan sangat lambat sambil menghasilkan output bitrate yang jauh lebih tinggi untuk kualitas yang sama. (Anda kadang-kadang masih harus menggunakan -pix_fmt yuv420p
jika Anda ingin 420
bukannya 444
h.264 output.
Kecuali Anda membuat file untuk penyimpanan jangka panjang, selalu gunakan -preset ultrafast
untuk x264 lossless. Lebih banyak frame referensi dan pencarian gerakan hampir tidak membuat perbedaan untuk lossless, untuk materi non-animasi dengan noise apa pun. CABAC mengambil sejumlah besar CPU pada bitrate lossless, bahkan untuk memecahkan kode. Hanya digunakan untuk keperluan arsip, bukan file awal. (ultrafast menonaktifkan CABAC). CABAC memberikan penghematan bitrate 10 hingga 15%.
Jika Anda membutuhkan setiap bingkai untuk menjadi bingkai kunci, atur -keyint 1
. Maka perangkat lunak pengeditan video yang hanya ingin memotong frame kunci atau jika tidak akan membatasi Anda.
Untuk menjawab pertanyaan awal: Inilah yang harus Anda lakukan untuk melempar file-file sementara sambil mencoba berbagai hal secara bertahap (misalnya deinterlace lambat, menyimpan output lossless sebelum mencoba hal-hal lain):
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
Jika Anda benar-benar membutuhkan hasil dalam file gambar yang dapat Anda modifikasi dengan alat gambar-diam, maka yakinkan, decode ke png. Anda tidak akan kehilangan apa pun lebih dari mungkin yang paling signifikan dari 8 bit untuk masing-masing nilai Y, Cb, dan Cr untuk setiap piksel.
x264 keluar BENAR-BENAR baik dalam hal ini karena ada banyak bingkai hitam dengan sedikit teks, fade-in dan fade-out, dan kesamaan sempurna antara area besar dari banyak frame, yang berhasil memanfaatkan bahkan dengan -preset ultrafast
. Pada live-action, saya masih melihat x264 di setengah filesize dari ffvhuff (yuv420).
Untuk siapa pun yang penasaran: Encode rgb lossless waktu-cpu tinggi waktu (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
Perhatikan fraksi p frame tertimbang yang sangat tinggi, dan juga fraksi skip makroblock yang sangat tinggi. Setiap transisi adegan memudar, bukan potongan, dan x264 mengambil keuntungan jika Anda memberikan waktu CPU untuk mencari caranya.
catatan lebih lanjut (codec lossy untuk diedit):
Untuk menggosok maju / mundur melalui klip, codec intra-only biasanya disukai (utvideo, ffvhuff, mjpeg, jpeg2000, pro-res, AVC-Intra). Saya membayangkan AVC biasa dengan GOP pendek (1/2 hingga 1 dtk) akan menggosok dengan cukup baik, asalkan perangkat lunak tahu apa yang dilakukannya (decode bingkai I terdekat saat menggosok cepat, dekode dalam GOP untuk sampai ke bingkai antar jika Anda memperbesar cukup pada timeline untuk itu diperlukan).
Saya telah memposting beberapa hal negatif tentang ini dan https://video.stackexchange.com/ tentang pro-res, seperti "apa gunanya jika kompresi lebih lambat dan lebih buruk daripada codec lossless", tetapi ia memiliki beberapa fitur menarik. Apple mengatakan bahwa ia dapat memecahkan kode dengan resolusi setengah menggunakan hanya 1/3 waktu CPU decoding rez penuh.
Implementasi ffmpeg mungkin tidak dioptimalkan untuk kecepatan seperti Apple juga, itulah sebabnya pengujian saya dengan ffmpeg membuatnya terlihat lambat. Mungkin tidak layak digunakan jika Anda memiliki alur kerja perangkat lunak bebas dengan alat-alat yang berbasis pada ffmpeg, tetapi mungkin patut dicoba jika Anda menggunakan perangkat lunak komersial.
Saya tidak melakukan banyak pengeditan video, sebagian besar hanya penyandian, jadi saya tidak memiliki perasaan yang baik tentang tes apa yang cocok untuk codec seperti prores. Saya kira mungkin mjpeg akan menjadi alternatif cepat yang baik, jika x264 GOP pendek tidak bekerja dengan baik. Ada implementasi asp-accelerated jpeg di distro Linux, dan ini adalah codec yang cukup sederhana. Anda dapat mengubah kualitas ke atas atau ke bawah sesuai kebutuhan untuk menukar kualitas vs kecepatan file + encode / decode. Ini kuno, tetapi jika Anda ingin codec intra-only yang sangat cepat, mungkin mengalahkan x264.
Untuk x264, saya akan mencoba sesuatu seperti x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(Intra-only, tanpa ada hal-hal lain yang --avcintra-class
mengatur.) Catatan superfast
(tanpa CABAC), atau faster
, ultrafast
mungkin bukan yang terbaik untuk operasi lossy. Saya pikir ultrafast kehilangan banyak kualitas tanpa menjadi jauh lebih cepat. Semakin rendah kualitas (crf lebih tinggi) yang Anda gunakan, semakin layak menghabiskan sedikit lebih banyak waktu CPU untuk menemukan penyandian yang lebih baik. Banyak dari ini mungkin tidak relevan dengan ukuran GOP = 1.
Dengan ukuran GOP> 1, jika Anda melempar begitu banyak bit pada encode sehingga inter-prediksi yang lebih baik tidak akan menghemat banyak bit saat menyandikan residu (karena perubahan noise / grain / halus antar frame semakin terpelihara dengan sangat akurat), maka hanya supercepat mungkin baik-baik saja. Kalau tidak, dengan --keyint=30
atau sesuatu, mungkin --preset veryfast --crf 12
akan menarik.
Secara teori, kualitas pada pengaturan CRF yang diberikan harus konstan di seluruh pengaturan awal. Jika Anda mencari file yang lebih kecil (decode lebih cepat), menukar kualitas dan waktu penyandian masuk akal.
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
.