ดังนั้นฉันเลยทำให้คำตอบของตัวเองนานเกินไป
TL; DR สรุป: สำหรับการจัดเก็บ losslessly ลำดับของภาพใช้libx264
หรือมีlibx264rgb
-preset ultrafast -qp 0
มันเกือบจะเร็วเท่ากับ ffvhuff ที่มีอัตราบิตต่ำกว่ามากและถอดรหัสได้เร็วขึ้น huffyuv
ได้รับการสนับสนุนอย่างกว้างขวางมากขึ้นนอก ffmpeg แต่ไม่รองรับรูปแบบพิกเซลมากเท่าที่ffvhuff
ควร นั่นเป็นอีกเหตุผลหนึ่งที่ใช้ h.264 สมมติว่าเครื่องมืออื่น ๆ ของคุณสามารถจัดการHigh 4:4:4 Predictive
โปรไฟล์h.264 ที่ x264 ใช้ในโหมด lossless x264 สามารถทำการภายในเท่านั้นถ้าต้องการการเข้าถึงเฟรมสุ่มอย่างรวดเร็ว
ระวังข้อผิดพลาด ffmpeg ที่มีผลต่อ libx264rgb เมื่ออ่านจากไดเรกทอรีรูปภาพ (และใครจะรู้ว่ามีกรณีอื่น ๆ อีกบ้าง) ทดสอบความสูญเสียในการตั้งค่าของคุณก่อนใช้งาน (ง่ายกับffmpeg -i in -pix_fmt rgb24 -f framemd5
แหล่งที่มาและการบีบอัดแบบไม่สูญเสีย)
แก้ไข: utvideo
เข้ารหัสและถอดรหัสค่อนข้างเร็วและเป็นตัวแปลงสัญญาณที่ง่ายกว่า h.264 มันเป็นพื้นที่ทันสมัยhuffyuv
พร้อมการรองรับ colorpaces ที่มีประโยชน์มากขึ้น หากคุณเคยมีปัญหากับ h.264 ลอง utvideo ถัดไปสำหรับไฟล์ชั่วคราว
แก้ไข 2: PNG ในฐานะตัวแปลงสัญญาณ RGB ดูเหมือนว่าจะทำได้ดีอย่างน้อยในตัวอย่าง Sintel
ดูคำตอบที่คล้ายกันของฉันสำหรับคำถามที่คล้ายกัน:
https://superuser.com/a/860335/20798
มีข้อมูลจำนวนมากในคำตอบของ Warren Young เกี่ยวกับรูปแบบและตัวแปลงสัญญาณดิบที่หลากหลาย ฉันคิดว่าคำตอบจะมีประโยชน์มากกว่านี้ถ้ามันสั้นกว่านี้ดังนั้นฉันจึงสร้างคำตอบใหม่ หากคุณกำลังทำงานกับซอฟต์แวร์ที่ไม่สนับสนุน lossless x264 หรือ ffvhuff แสดงว่าข้อมูลบางอย่างนั้นยังคงมีประโยชน์
คำจำกัดความที่มีประโยชน์ที่สุดของ "lossless" ในบริบทนี้คือคุณสามารถกู้คืนบิตอินพุตสำหรับบิตได้ ไม่ต้องกังวลกับการลดคุณภาพจากการเข้ารหัสวิดีโอไม่ว่าคุณจะทำอะไร
http://en.wikipedia.org/wiki/Chroma_subsampling
เป็นการดีหลีกเลี่ยงการแปลงหลายสี ข้อผิดพลาดในการปัดเศษอาจเกิดขึ้นได้ หากคุณกำลังจะใช้งานวิดีโอของคุณด้วยตัวกรองที่ทำงานในพื้นที่สี RGB แสดงว่า RGB นั้นเหมาะสมแล้วตราบใดที่บิตเรตที่สูงขึ้นก็ไม่ใช่ปัญหา คุณอาจจะผลิตyuv 4:2:0
วิดีโอในท้ายที่สุดแต่การรักษาความละเอียดของสีเพิ่มอาจมีประโยชน์ขึ้นอยู่กับตัวกรองที่คุณจะนำไปใช้
ทั้งทาง x264 lossless และ ffvhuff ทั้งสนับสนุน RGB และ YUV 4:4:4
, และ4:2:2
4:2:0
ฉันแนะนำ x264 เพราะมันเร็วในการถอดรหัส หากคุณกำลังพยายามเล่นวิดีโอ RGB HD แบบเรียลไทม์ลองใช้ opengl แทน xv เนื่องจาก xv ในระบบของฉันยอมรับเฉพาะอินพุต yuv เท่านั้น mplayer ใช้เวลา CPU เพิ่มเพื่อทำการแปลงพื้นที่สี
แหล่งที่มาสำหรับการทดสอบการเข้ารหัสต่อไปนี้: https://media.xiph.org/ https://media.xiph.org/sintel/sintel_trailer-1080-png.tar.gz พวกเขาลืม gzip ไฟล์ y4m สำหรับตัวอย่าง sintel ดังนั้น png tarball จึงมีขนาดเล็กกว่ามาก
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
เช่น
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
โปรดทราบว่าฉันลืมระบุ-r 24
fps ดังนั้นมันจะไม่ซิงค์ av กับเสียง (และขนาดบิตเรต (แต่ไม่ใช่ขนาดไฟล์)) จะถูกปิดเช่นกัน ffmpeg มีค่าเริ่มต้นที่ 25fps) ซีพียูในเครื่องนี้เป็นรุ่นที่ 1 เจนเนอร์ (conroe) core2duo 2.4GHz (E6600)
ผล:
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
โปรดทราบว่าmediainfo
ไม่ทราบเกี่ยวกับ RGB h.264 แต่ก็ยังกล่าวว่าไฟล์ดังกล่าวเป็น YUV
ตรวจสอบว่ามันเป็นแบบไม่สูญเสียจริง ๆ :
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
ดังนั้นคุณสามารถกู้คืนอินพุต PNG ดั้งเดิมด้วยวิธีนั้นได้เช่นคุณสามารถสร้าง PNG ด้วยข้อมูลภาพเหมือนกันได้
สังเกตการ-pix_fmt rgb24
ทดสอบ x264 ตัวถอดรหัส h.264 ของ ffmpeg จะเอาต์พุต gbrp (ระนาบ, ไม่ได้บรรจุ) ดังนั้นบิตจะเหมือนกัน แต่อยู่ในลำดับที่ต่างกัน framemd5 "container" ไม่ได้กำหนดข้อ จำกัด การจัดรูปแบบใด ๆ แต่คุณจะได้รับ md5 เท่ากันถ้าบิตมีการจัดเรียงแบบเดียวกัน ฉันแค่ดูสิ่งที่ ffmpeg บอกว่ามันใช้สำหรับ pix fmt เมื่อฉันป้อน PNGs จากนั้นใช้สิ่งนั้นเป็นอาร์กิวเมนต์-pix_fmt
สำหรับการถอดรหัส อนึ่งนี่คือเหตุผลที่ vlc จะไม่เล่นไฟล์ RGB h.264 (จนกว่าจะมีการเปิดตัวครั้งต่อไปหรือสร้างขึ้นทุกค่ำคืน): ไม่รองรับรูปแบบพิกเซล gbrp
สำหรับการใช้งาน YUV ไม่libx264
libx264rgb
คุณไม่จำเป็นต้องติดตั้งรุ่น RGB ของ x264 ห้องสมุดจริงรองรับทั้งสองอย่าง มันเป็นเพียง ffmpeg ที่ใช้มันเป็นเครื่องเข้ารหัสสองชื่อที่แตกต่างกัน ฉันคิดว่าถ้าพวกเขาไม่ได้ทำสิ่งนั้นพฤติกรรมเริ่มต้นก็คือปล่อยอินพุต rgb เป็น rgb และทำงานช้ามากในขณะที่ให้ผลผลิตบิตเรตที่สูงกว่ามากสำหรับคุณภาพเดียวกัน (บางครั้งคุณยังต้องใช้-pix_fmt yuv420p
ถ้าคุณต้องการ420
แทนการ444
ส่งออก h.264
นอกจากว่าคุณกำลังสร้างไฟล์สำหรับการจัดเก็บระยะยาวให้ใช้-preset ultrafast
สำหรับ lossless x264 เสมอ เฟรมอ้างอิงเพิ่มเติมและการค้นหาการเคลื่อนไหวแทบจะไม่สร้างความแตกต่างใด ๆ สำหรับการสูญเสียสำหรับวัสดุที่ไม่มีภาพเคลื่อนไหวพร้อมเสียงรบกวน CABAC ใช้ CPU จำนวนมากที่บิตเรตแบบไม่สูญเสียแม้กระทั่งการถอดรหัส ใช้เพื่อวัตถุประสงค์ในการเก็บถาวรเท่านั้นไม่ทำให้ไฟล์เป็นรอย (ปิดใช้งาน CABAC เร็วมาก) CABAC ให้การประหยัดบิตเรต 10 ถึง 15%
-keyint 1
หากคุณต้องการทุกกรอบจะเป็นคีย์เฟรมชุด จากนั้นซอฟต์แวร์ตัดต่อวิดีโอที่ต้องการตัดเฉพาะคีย์เฟรมหรือ w / e จะไม่ จำกัด คุณ
ในการตอบคำถามเดิม: นี่คือสิ่งที่คุณควรทำเมื่อทิ้งไฟล์ชั่วคราวขณะลองทำสิ่งต่าง ๆ เป็นระยะ ๆ (เช่น deinterlace ช้าการบันทึกเอาต์พุตแบบไม่สูญเสียก่อนที่จะลองสิ่งอื่น):
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
หากคุณต้องการเอาท์พุทของคุณในไฟล์ภาพที่คุณสามารถแก้ไขด้วยเครื่องมือภาพนิ่งคุณต้องถอดรหัสเป็น png คุณจะไม่สูญเสียอะไรมากไปกว่าความสำคัญน้อยที่สุดของ 8 บิตสำหรับแต่ละค่า Y, Cb และ Cr สำหรับแต่ละพิกเซล
x264 -preset ultrafast
ออกมาได้ดีจริงๆในเรื่องนี้เพราะมีจำนวนมากของเฟรมสีดำกับบิตของข้อความในการจางหายและจางหายออกและสมบูรณ์แบบคล้ายคลึงกันระหว่างพื้นที่ขนาดใหญ่ของเฟรมจำนวนมากซึ่งจะจัดการการใช้ประโยชน์จากแม้จะมี ในไลฟ์แอ็กชันฉันยังเห็น x264 ครึ่งหนึ่งของขนาดไฟล์ของ ffvhuff (yuv420)
สำหรับทุกคนที่สงสัย: การเข้ารหัส rgb lossless เวลาสูงมี (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
สังเกตสัดส่วน p น้ำหนักที่สูงมาก ๆ และส่วนที่สูงของข้าม macroblocks การเปลี่ยนฉากทุกครั้งจะจางหายไปไม่ใช่การตัดและ x264 จะได้เปรียบถ้าคุณให้เวลากับซีพียูเพื่อหาวิธี
หมายเหตุเพิ่มเติม (ตัวแปลงสัญญาณที่เสียสำหรับการแก้ไข):
สำหรับการขัดเกลาไปข้างหน้า / ข้างหลังผ่านคลิปมักใช้ตัวแปลงสัญญาณภายในเท่านั้น (utvideo, ffvhuff, mjpeg, jpeg2000, pro-res, AVC-Intra) ฉันคิดว่า AVC ปกติกับ GOPs สั้น ๆ (1/2 ถึง 1 วินาที) จะค่อนข้างดีเช่นกันตราบใดที่ซอฟต์แวร์รู้ว่ามันกำลังทำอะไรอยู่ (ถอดรหัสที่ใกล้ที่สุดฉันใส่เฟรมเมื่อขัดอย่างรวดเร็วถอดรหัสภายใน GOP เพื่อไปที่ กรอบระหว่างถ้าคุณซูมเข้าไปในเส้นเวลามากพอที่จะต้องใช้)
ฉันได้โพสต์สิ่งที่เป็นลบเกี่ยวกับเรื่องนี้และhttps://video.stackexchange.com/เกี่ยวกับการลดความละเอียดเช่น "อะไรคือจุดที่ว่าถ้าการบีบอัดช้าลงและแย่ลงกว่าตัวแปลงสัญญาณแบบไม่สูญเสีย" แต่มีคุณสมบัติที่น่าสนใจ Apple บอกว่ามันสามารถถอดรหัสที่ความละเอียดครึ่งหนึ่งโดยใช้เวลาเพียง 1/3 ของเวลา CPU ในการถอดรหัส full rez
การใช้ prores ของ ffmpeg อาจไม่ได้รับการปรับให้เหมาะสมกับความเร็วเช่นเดียวกับของ Apple ซึ่งเป็นสาเหตุที่การทดสอบของฉันกับ ffmpeg ทำให้มันดูช้า อาจไม่คุ้มค่าหากคุณมีเวิร์กโฟลว์ซอฟต์แวร์ฟรีพร้อมเครื่องมือที่ใช้ ffmpeg แต่อาจคุ้มค่าที่จะลองใช้หากคุณใช้ซอฟต์แวร์เชิงพาณิชย์
ฉันไม่ทำการตัดต่อวิดีโอจำนวนมากส่วนใหญ่เป็นเพียงการเข้ารหัสดังนั้นฉันจึงไม่มีความรู้สึกที่ดีว่าการทดสอบใดที่เหมาะสมสำหรับตัวแปลงสัญญาณเช่นการแสดงผล ฉันเดาว่า mjpeg อาจจะเป็นทางเลือกที่รวดเร็วถ้า GOP สั้น x264 ทำงานได้ไม่ดี มีการใช้งาน jpeg ใน asm-accelerated ของ Linux distros และมันก็เป็น codec ธรรมดา ๆ คุณสามารถเปลี่ยนคุณภาพขึ้นหรือลงได้ตามต้องการเพื่อแลกกับคุณภาพเทียบกับขนาดไฟล์ + ความเร็วในการเข้ารหัส / ถอดรหัส มันเป็นของโบราณ แต่ถ้าคุณต้องการตัวแปลงสัญญาณภายในเท่านั้นที่เร็วจริงๆมันอาจชนะ x264
สำหรับ x264 ฉันจะลองแบบx264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(ภายในอย่างเดียวโดยไม่มีสิ่งอื่นใดที่--avcintra-class
กำหนดไว้) หมายเหตุsuperfast
(ไม่มี CABAC) หรืออาจfaster
ไม่ultrafast
ดีที่สุดสำหรับการสูญเสียการดำเนินการ ฉันคิดว่า Ultrafast สูญเสียคุณภาพจำนวนมากโดยไม่ต้องเร็วขนาดนั้น คุณภาพที่ต่ำกว่า (crf สูงกว่า) ที่คุณใช้ยิ่งคุ้มค่ากับการใช้เวลาของ CPU มากขึ้นในการค้นหาการเข้ารหัสที่ดีขึ้น สิ่งนี้อาจไม่เกี่ยวข้องกับขนาด GOP = 1
ด้วยขนาด GOP> 1 หากคุณขว้างบิตจำนวนมากที่การเข้ารหัสที่ดีกว่าการทำนายระหว่างกันจะไม่บันทึกหลายบิตเมื่อเข้ารหัสส่วนที่เหลือ แค่เร็วสุด ๆ คงไม่เป็นไร ไม่อย่างนั้นก็ด้วย--keyint=30
หรือบางอย่างอาจ--preset veryfast --crf 12
จะน่าสนใจ
ในทางทฤษฎีคุณภาพของการตั้งค่า CRF ที่กำหนดควรเป็นค่าคงที่ข้ามค่าที่ตั้งไว้ล่วงหน้า หากคุณกำลังมองหาไฟล์ที่มีขนาดเล็กลง (ถอดรหัสได้เร็วขึ้น) การแลกเปลี่ยนคุณภาพและเวลาในการเข้ารหัสจะสมเหตุสมผล
ffmpeg -i input.avi -c:v qtrle -pix_fmt rgb24 output.mov
สำหรับการอ้างอิงมันเป็น