介绍
我使用以下命令来消除抖动并稳定视频:
ffmpeg2 -i SHAKY_INPUT_VIDEO.mp4 -vf \
vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result=transform_vectors.trf \
-f null -
ffmpeg2 -i SHAKY_INPUT_VIDEO.mp4 -vf \
vidstabtransform=input=transform_vectors.trf:zoom=1:smoothing=30,unsharp=5:5:0.8:3:3:0.4 \
-vcodec libx264 -preset slow -tune film -crf 18 -acodec copy SMOOTH_OUTPUT_VIDEO.mkv
(我使用 mkv,因为 mp4 输出会导致此错误:在流 #1 中找不到编解码器 pcm_s16le 的标签,容器中当前不支持编解码器)
来源:https://www.epifocal.net/blog/video-stabilization-with-ffmpeg
我使用 ffmpeg2(参见使用脚本消除视频抖动)
如何缩小视频尺寸?
上面两行代码可以稳定视频大小。如何减小尺寸?
我看到两个方面:
- 声音的
- 分辨率。如果我理解以下输出,则分辨率目前为 1920x1080。我认为 720p 就足够了。
我的视频元数据:
===> ffprobe2 20170217_114248.MOV
ffprobe version git-2017-02-19-3206ea4 Copyright (c) 2007-2017 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libfreetype --enable-gnutls --disable-ffserver --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvidstab --enable-libtheora --enable-libwavpack --enable-libopenjpeg --enable-libgsm --enable-nvenc
libavutil 55. 47.100 / 55. 47.100
libavcodec 57. 80.101 / 57. 80.101
libavformat 57. 66.102 / 57. 66.102
libavdevice 57. 2.100 / 57. 2.100
libavfilter 6. 73.100 / 6. 73.100
libavresample 3. 2. 0 / 3. 2. 0
libswscale 4. 3.101 / 4. 3.101
libswresample 2. 4.100 / 2. 4.100
libpostproc 54. 2.100 / 54. 2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '20170217_114248-Felix-Jáchymovská.MOV':
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2017-02-17T10:39:32.000000Z
Duration: 00:03:15.00, start: 0.000000, bitrate: 23478 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 22060 kb/s, 60 fps, 60 tbr, 60k tbn, 120k tbc (default)
Metadata:
creation_time : 2017-02-17T10:39:32.000000Z
handler_name : iCatch Alias Data Handler
encoder : iCatch AVCC
Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 44100 Hz, 2 channels, s16, 1411 kb/s (default)
Metadata:
creation_time : 2017-02-17T10:39:32.000000Z
handler_name : iCat Alias Data Handler
答案1
您有几种方法可以减少输出文件的大小:
对音频进行编码
正如您所提到的,您可以对音频进行编码,而不是流式复制大量无损未压缩的 PCM 格式。
使用 libfdk_aac
您的ffmpeg
编码器支持 AAC 编码器 libfdk_aac,这是目前支持的最佳 AAC 编码器ffmpeg
。要使用它,请将其替换-c:a copy
为-c:a libfdk_aac -vbr 5
。
使用原生 FFmpeg AAC 编码器
或者,您可以使用原生 FFmpeg AAC 编码器。要使用它,请将其替换-c:a copy
为-c:a aac -b:a 128k
。它不如 libfdk_aac 好,但给它更多位,它就可以接受。
现在,如果您更喜欢 MP4 输出容器格式(而不是 Matroska (MKV)),您可以使用它。
有关这两个编码器的更多信息,请参阅FFmpeg 维基百科:AAC。
使用更高的-crf
值
当使用 libx264 编码 H.264 视频时,该-crf
选项是速率控制控制质量。约 18 左右的值或多或少会产生视觉无损输出,但根据内容的不同,也可能导致文件较大。将值增加 +6 通常会使输出文件大小减少 50%。一般建议是使用-crf
仍能提供可接受质量的最高值。
如果您的目标是特定的输出文件大小(例如由于存储介质的限制),那么您应该使用两遍模式进行编码。但是,除非特定的目标文件大小至关重要,否则使用这种方法会更容易、更快捷-crf
(我已经很多年没有使用过两遍了)。
有关详细信息,请参阅FFmpeg 维基:H.264。
使用不同的编码器
如果正确使用,使用 libx26 编码为 H.265/HEVC5可能会在保持相同感知质量的情况下减小文件大小。但代价是编码速度较慢,并且播放器/设备支持还不如 H.264 那么普遍。
我自己没有用过这个编码器,所以我不知道-crf
该建议什么值,但它应该值得一试。-preset veryslow
如果你已经在使用 x264 中较慢的预设之一,你可能必须使用它才能真正超越 x264。
扩展
如果您想要缩小规模,在两个命令中首先进行缩放可能比在第二个命令中最后进行缩放更快。您必须进行实验,因为我不熟悉 vidstab*,也不知道它是否是瓶颈。
-vf scale=-2:720,vidstab*...