因此,我最终回答自己的时间太长了。
TL; DR摘要:要无损地存储图像序列,请使用libx264
或libx264rgb
与配合使用-preset ultrafast -qp 0
。它几乎与ffvhuff一样快,比特率更低,并且解码速度更快。 huffyuv
在ffmpeg之外,它得到了更广泛的支持,但不支持ffvhuff
。因此,这是使用h.264的另一个原因,假设您的其他工具可以处理High 4:4:4 Predictive
x264在无损模式下使用的h.264 配置文件。x264仅在需要快速随机访问任意帧的情况下才可以进行内部。
当从图像目录中读取时,请注意会影响libx264rgb 的ffmpeg错误。(以及谁知道其他情况。)在使用前测试设置中的无损性。(易于ffmpeg -i in -pix_fmt rgb24 -f framemd5
在源上进行无损压缩)
编辑:utvideo
编码和解码相当快,并且是比h.264简单得多的编解码器。它基本上是现代的huffyuv
,支持更多有用的色彩空间。如果您在使用h.264时遇到问题,请尝试使用utvideo接下来的临时文件。
edit2:至少在Sintel预告片上,PNG作为RGB编解码器似乎表现良好。
另请参阅我对类似问题的类似答案:https :
//superuser.com/a/860335/20798
沃伦·杨(Warren Young)的答案中有很多有关各种原始格式和编解码器的信息。我认为答案越短越有用,所以我正在做一个新的答案。如果您正在使用不支持无损x264或ffvhuff的软件,那么其中一些信息可能仍然有用。
在这种情况下,“无损”的最有用定义是您可以逐位恢复输入。无论您做什么,零担心视频编码导致的质量下降。
http://en.wikipedia.org/wiki/Chroma_subsampling
理想情况下,避免进行多次色彩空间转换。舍入错误可能会累积。如果您要使用可在RGB颜色空间中使用的滤镜来处理视频,则只要较高的比特率不成问题,将其保留为RGB就很有意义。您最终可能会制作yuv 4:2:0
视频,但是根据要应用的滤镜,保持额外的色度分辨率可能很有用。
无论哪种方式,无损X264和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 他们忘了为sintel预告片添加y4m文件的gzip文件,因此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)。本机中的CPU是第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测试。ffmpeg的h.264解码器输出gbrp(平面,未打包)输出,因此位相同,但顺序不同。framemd5“容器”没有施加任何格式限制,但是如果位的排列方式相同,则只会得到相同的md5。我只是看了ffmpeg告诉我它在供PNG使用时用于pix fmt的意思,然后将其用作-pix_fmt
用于解码的arg 。顺便说一句,这就是vlc无法播放RGB h.264文件(直到下一个版本或当前的夜间构建)的原因:它不支持gbrp像素格式。
对于yuv使用libx264
,不是libx264rgb
。您无需安装RGB版本的x264,实际的库同时支持这两种格式。只是ffmpeg将其实现为两个不同名称的编码器。我认为,如果他们没有这样做,默认的行为是将rgb输入保留为rgb,并以非常慢的速度运行,同时以相同的质量产生更高的比特率输出。(-pix_fmt yuv420p
如果需要420
,有时仍需要使用,而不是444
h.264输出。
除非您要长期存储文件,否则请始终使用-preset ultrafast
无损x264。更多的参考系和运动搜索对于无损,对于具有任何噪声的非动画材料来说几乎没有什么区别。CABAC甚至以解码方式都以无损比特率占用大量CPU。仅用于存档目的,不用于暂存文件。(超快速禁用CABAC)。CABAC可节省10%至15%的比特率。
如果需要将每个帧都作为关键帧,请设置-keyint 1
。然后,仅想剪切关键帧或w / e的视频编辑软件将不会限制您。
要回答最初的问题:这是在分阶段尝试一些操作时(例如,缓慢的隔行扫描,在尝试其他操作之前保存无损输出的方法)在临时文件周围扔东西的方法:
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。对于每个像素的Y,Cb和Cr值,您将不会损失任何8位最低有效位。
x264在这方面非常出色,因为存在很多带有一些文本的黑色框架,淡入和淡出以及许多帧的大区域之间的完美相似性,即使使用,它也可以利用-preset ultrafast
。在实景拍摄中,我仍然看到x264在ffvhuff(yuv420)文件大小的一半。
对于任何好奇的人:高CPU时间无损rgb编码具有(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
请注意,加权p帧的实际比例很高,并且跳过宏块的比例也很高。每个场景过渡都是淡入淡出,而不是剪切,如果您给x264分配CPU时间来找出方法,则x264会发挥作用。
进一步说明(有损编解码器):
对于通过剪辑进行向前/向后的擦洗,通常仅使用内部编解码器(utvideo,ffvhuff,mjpeg,jpeg2000,pro-res,AVC-Intra)。我以为具有短GOP(1/2到1秒)的常规AVC也可以很好地进行擦洗,只要软件知道它在做什么(快速擦洗时解码最近的I帧,在GOP内解码即可到达)如果您在时间轴上放大了足够的帧以进行此操作)。
我在此和https://video.stackexchange.com/上发布了一些关于pro-res的负面信息,例如“如果压缩比无损编解码器更慢和更糟,那将是什么意义”,但是它确实具有一些有趣的功能。 苹果公司表示,它可以使用解码完整rez的CPU时间的1/3进行半分辨率解码。
ffmpeg的prores实施在速度上可能不如Apple那样优化,这就是为什么我对ffmpeg进行的测试使它看起来很慢。如果您具有使用基于ffmpeg的工具的免费软件工作流,可能不值得使用,但是如果您使用的是商业软件,则可能值得尝试。
我没有做太多的视频编辑,主要是编码,所以我对适合prores等编解码器的测试不太了解。我猜想,如果短GOP x264无法正常工作,那么mjpeg可能是一个不错的快速选择。Linux发行版中有jpeg的asm加速实现,这是一个非常简单的编解码器。您可以根据需要提高或降低质量,以权衡质量与文件大小+编码/解码速度之间的关系。它很古老,但是如果您想要一个真正快速的仅内部编解码器,它可能会击败x264。
对于x264,我会尝试类似x264 --crf 10 --keyint=1 --preset superfast --tune fastdecode
(仅限内部使用,而不会设置任何其他--avcintra-class
设置的东西。)请注意superfast
(不使用CABAC),或者faster
,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
。