繁体   English   中英

在使用 ffmpeg 转换视频文件时,如何实现良好的压缩率和时间比?

How could I achieve a good ratio of compression and time while converting video files with ffmpeg?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

所以,我制作了 2 个脚本来转换 mp4 视频中的闭路电视镜头。 其中一个只是一个-vcodec copy并创建了一个与素材相同大小的 mp4(巨大的,顺便说一句),我的另一个选择是调整一些参数并找出我能做的最好的事情,而不会牺牲太多的质量和让它“快”。 然后我想出了c:v libx264 -crf 30 -preset veryfast -filter:v fps=fps=20这在我的机器上花了大约 2 秒的时间来运行一个平均 6MB 的文件并转换成一个 600kB 的文件。

对结果很满意我决定把它放在 AWS lambda 上(以避免瓶颈),然后人们开始抱怨丢失的文件,所以我将超时和内存增加到 380MB。 即使在那之后,我仍然收到一些 lambda 错误......

无论如何,与仅存储不压缩的文件相比,lambda 会花费我太多,还有另一种方法可以在不牺牲时间的情况下减小大小吗?

[更新]我处理了一些数字,即使使用 lambda 并不是我所期望的,我仍然通过将文件大小减小 10 倍来每月节省大量现金。

正如所问,这是 ffmpeg 的日志。

ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10 (GCC)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' -I/usr/include/rav1e' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-liblensfun --enable-libmp3lame --enable-libmysofa --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-vulkan --enable-libglslang --enable-libx264 --enable-libx265 --enable-libxvid --enable-libxml2 --enable-libzimg --enable-libzvbi --enable-lv2 --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-lto --enable-libmfx --enable-runtime-cpudetect
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, dhav, from 'ch1_principal_28122020030156_28122020030600.dav':
  Duration: N/A, start: 1609124514.000000, bitrate: N/A
    Stream #0:0: Video: hevc (Main), yuvj420p(pc, bt709), 960x480, 30 fps, 30 tbr, 1k tbn
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x556ce99e7100] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x556ce99e7100] profile High, level 3.1, 4:2:0, 8-bit
[libx264 @ 0x556ce99e7100] 264 - core 160 r3011 cde9a93 - H.264/MPEG-4 AVC codec - Copyleft 2003-2020 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=250 keyint_min=20 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=crf mbtree=1 crf=30.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to '_test1.mp4':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj420p(pc), 960x480, q=-1--1, 20 fps, 10240 tbn, 20 tbc
    Metadata:
      encoder         : Lavc58.91.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
[dhav @ 0x556ce99b8400] Packet corrupt (stream = 0, dts = NOPTS).te= 127.1kbits/s speed=10.9x    
ch1_principal_28122020030156_28122020030600.dav: corrupt input packet in stream 0
frame=  805 fps=226 q=-1.0 Lsize=     682kB time=00:00:40.10 bitrate= 139.4kbits/s speed=11.2x    
video:672kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.521397%
[libx264 @ 0x556ce99e7100] frame I:4     Avg QP:27.76  size: 31382
[libx264 @ 0x556ce99e7100] frame P:205   Avg QP:30.62  size:  2110
[libx264 @ 0x556ce99e7100] frame B:596   Avg QP:33.91  size:   217
[libx264 @ 0x556ce99e7100] consecutive B-frames:  1.1%  0.2%  0.7% 97.9%
[libx264 @ 0x556ce99e7100] mb I  I16..4:  8.3% 41.1% 50.6%
[libx264 @ 0x556ce99e7100] mb P  I16..4:  0.9%  3.0%  0.4%  P16..4: 16.9%  4.1%  1.3%  0.0%  0.0%    skip:73.4%
[libx264 @ 0x556ce99e7100] mb B  I16..4:  0.1%  0.2%  0.0%  B16..8:  1.4%  0.4%  0.0%  direct: 0.9%  skip:96.9%  L0:42.0% L1:48.0% BI: 9.9%
[libx264 @ 0x556ce99e7100] 8x8 transform intra:63.1% inter:40.6%
[libx264 @ 0x556ce99e7100] coded y,uvDC,uvAC intra: 55.6% 40.9% 5.0% inter: 1.4% 2.1% 0.0%
[libx264 @ 0x556ce99e7100] i16 v,h,dc,p: 27% 28% 24% 21%
[libx264 @ 0x556ce99e7100] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 16% 26%  6%  6%  6%  7% 11%  7%
[libx264 @ 0x556ce99e7100] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 17% 15%  9%  6%  6%  7% 13%  6%
[libx264 @ 0x556ce99e7100] i8c dc,h,v,p: 63% 16% 16%  5%
[libx264 @ 0x556ce99e7100] Weighted P-Frames: Y:8.8% UV:1.0%
[libx264 @ 0x556ce99e7100] kb/s:136.66
1 个回复

libx264

您必须在编码速度和编码效率之间选择一个平衡点。

  1. 选择您有耐心的最慢-preset
  2. 选择提供可接受质量的最高-crf值。

有关更多信息,请参阅FFmpeg Wiki:H.264

libx265

如果 libx264 不能制作足够小的文件,请尝试使用 libx265,但编码需要更长的时间。

有关更多信息,请参阅FFmpeg Wiki:HEVC/H.265

硬件加速编码器

如果您有合适的硬件,那么您可以使用 NVENC、QuickSync 或其他一些实现。

编码速度会很快,但与 libx264 或 libx265 提供的每比特质量不匹配。

有关更多信息,请参阅FFmpeg Wiki:硬件

1 从 ffmpeg 输出中获取压缩率?

在编码过程中, ffmpeg在使用 H264 编解码器时接受一个“压缩率”( crf )参数(与实际压缩率不同): 是否可以通过检查视频文件来获取此参数的值? 据我所知,它似乎不是元数据的一部分。 ...

3 使用教科书的霍夫曼编码算法,哪些文件具有良好的压缩率?

我现在正在测试霍夫曼编码,我想知道哪种类型的文件(例如.txt,.jpg,.mp3等)在进行基于霍夫曼的压缩时会经历良好的压缩。 我在Java中实现了霍夫曼编码,发现.txt文件(带有普通英文文本的文件)的大小减少了约40%,. jpg,.mp3和.mp4的大小减少了约0%-1%文件(当然,我 ...

4 预测文件无损压缩的时间或压缩率?

当使用某种无损压缩算法压缩文件时,人们将如何预测执行时间和/或压缩率? 我特别关注本地压缩,因为如果您知道本地压缩的时间和压缩率,则可以根据当前可用的网络吞吐量轻松计算网络压缩的时间。 假设您有一些有关文件的信息,例如大小,冗余性,类型(我们可以说文本来保持简单)。 也许我们从实际的先 ...

5 使用 ffmpeg 转换大视频文件

我正在使用 ffmpeg 工具使用以下代码将视频从 wmv 转换为 mp4 格式 - 它适用于高达 20mb 的视频,但是当我尝试播放 70mb 以上的视频时,它会引发以下错误 - FFmpeg 版本 SVN-r6179,版权所有 (c) 2000-2004 Fabrice Bellard ...

7 使用FFmpeg的不同分辨率的Concat视频文件

我正在使用FFmpeg在我的android应用程序中连接视频。我已经按照一些步骤合并了不同格式的视频。 对于mp4视频,我必须将所有输入文件转换为MPEG-2 TS文件,然后合并所有.ts文件以获得输出mp4文件。 如果它们具有不同的分辨率(例如一个是640 * 480而另一个是12 ...

8 在Android中使用FFMPEG和SDK压缩视频文件

我需要先压缩视频文件,然后再将其发送到服务器。搜索之后,我知道可以使用FFMPEG来完成此操作,但这只能使用NDK来完成。 我想使用Java库(即使用SDK)压缩视频,这可能吗? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM