导语
本文章并不作为ffmpeg的教程,旨在对一些ffmpeg最常用的代码做一个记录,以此避免每次使用ffmpeg的时候都去查阅相关资料。
背景
·起
首先想说的是为什么会想到使用ffmpeg这个工具。在中国农历2020年前,有次去外公家吃饭。外公拿出来一台便携式DVD影碟机。
外公使用的这一款并不能上网,只有基本的从光盘、U盘、以及TF卡播放的功能。外公喜欢看花鼓戏,于是想着我帮忙下一些花鼓戏来看。值得一提的是播放器的屏幕是4:3的,正好花鼓戏的录像都是4:3比例,这并不会有影响;除非有转录的(视频两边有黑边)或者4:3比例拉伸成16:9的视频需要处理。但是因为不知道这台播放器支持播放视频的格式,所以网上下载下来的视频都转码成h.264/aac并以.mp4封装。
·承
于是我回家后在各大影视网站查找有没有人上传花鼓戏的资源,然后通过下载工具下载影视网站上的视频。在此过程中我发现了一个比较好用的网站能在线获取直链下载视频。
视频鱼——http://shipinyu.com 注:通过测试发现优酷的资源下载会不定时失效,相对来说腾讯视频的资源比较好下载。
·转
但是通过这种方式下载下来的视频是有分段的,这时候要借助视频编辑软件将这些分段拼接到一起。
但是如果使用诸如Adobe Premiere这种软件来拼接这么大量的视频,有点高射炮打蚊子的感觉。先不说每次打开Premiere需要多长时间、占用多少资源,视频的渲染导出是一个麻烦问题,因为Premiere视频导出速率不是很理想。并且如果这时候控制不好码率则会造成视频体积大幅度上升。
·合
这时候我就想到了使用ffmpeg这个工具。首先这个工具是在命令行操作,软件体积也很小,不会像使用Premiere一样每次启动都大动干戈。其次,使用命令或者脚本操作大批量视频合并,画面的裁剪、变换,或者格式转码会非常方便快捷。
常用代码
参考网站
https://www.ffmpeg.org/ffmpeg.html
https://trac.ffmpeg.org/wiki
一、多个视频拼接成一个视频
ffmpeg -f concat -i filelist.txt -c:v h264_videotoolbox -acodec aac -b:v 2000k output.mp4
-f concat 「使用concat分离器」
-i 「指定输入文件」
-c (codec) 「编解码器」 *使用copy指令则不重新编码
-vcodec (-codec:v) (-c:v) 「视频编解码器」
-acodec (-codec:a) 「音频编解码器」
-vf scale=960:720 「缩小成目标分辨率」*宽高比不固定,在一个参数使用-1则可以保持宽高比,如:960:-1。
-vf crop=960:720:12:34 「裁剪成目标分辨率」*后两个参数是裁剪中心位置,不指定则默认从中间裁剪。
-aspect 4:3 「更换比例」
-b:v 「视频比特率」*有单位,例:k、M,不指定则默认为bit。
注:视频编码器有多种,如果不设置参数,如:h264,则只使用CPU编解码。如果想使用硬件加速,则要加上参数。例:
-c:v h264_qsv 「Intel QSV硬件加速」
-c:v h264_amf 「AMD硬件加速」
-c:v h264_videotoolbox 「Mac硬件加速」
-c:v h264_cuvid -c:v h264_nvenc 「前者为Nvidia硬件解码,后者为编码」*顺序重要,例:
ffmpeg -c:v h264_cuvid -i <input> -c:v h264_nvenc -b:v 3000k <output>
**因为编码器有预设画质,如果不加参数则默认是「中」画质。原因是默认使用CRF「固定码率编码」以此减少视频文件体积。如果想无损输出,则可以使用-crf 0参数。但是wiki不推荐使用,因为这会导致视频体积过大,也会造成编解码器负载过重。并且,每个编码器预设并不相同,所以建议手动指定「视频码率」,避免画质过低。
也可在编码器后使用-preset medium指定预设:
·ultrafast
·superfast
·veryfast
·faster
·fast
·medium – default preset
·slow
·slower
·veryslow
·placebo – ignore this as it is not useful
hevc/h265编码器:
-c:v libx265
-c:v hevc_videotoolbox 「Mac硬件加速」
-x265-params lossless=1 「无损编码」
以下是拼合视频文件列表「filelist.txt」,这个文件要和视频文件放在同一个文件夹里面。
file 'file 1.mp4'
file 'file 2.mp4'
file 'file 3.mp4'
二、单个视频剪切成多个视频
ffmpeg -ss 00:00:00 -accurate_seek -i test.mp4 -t 00:01:00 -vcodec copy -acodec copy output.mp4
ffmpeg -ss 00:00:00 -i sample_Input.mp4 -t 01:17:55 -c copy sample_Output-part1.mp4 #Start~01:17:55
ffmpeg -ss 01:17:56 -i sample_Input.mp4 -t 00:48:57 -c copy sample_Output-part2.mp4 #01:17:56~02:06:50
ffmpeg -ss 02:06:55 -i sample_Input.mp4 -t 01:11:48 -c copy sample_Output-part3.mp4 #02:06:51~End
-ss 「开始时间」
-t / -to 「指定需要截取多长时间」*如果需要截取剩下全部内容,则不需要添加此参数
**时间可以为00:00:00格式,也可以为「秒数」。
-copyts 在输出之前添加此参数,可以使得-to的时间设置为原视频时间轴上的时间。(而非截取出来的新视频的长度)
-accurate_seek
-avoid_negative_ts make_zero 用于纠正视频开始时间不正确,可能出现负数时间轴。
三、目标路径下批量转码(macOS)
find ./ -name '*.flv' -exec sh -c 'ffmpeg -i "$0" -c:v h264_videotoolbox -acodec aac -allow_sw 1 "${0%%.flv}.mp4"' {} ;
四、音频处理
1、合并音频和视频,给音频重新编码
ffmpeg -i video.mp4 -i audio.wav \
-c:v copy -c:a aac -strict experimental output.mp4
在这里,我们假定视频文件没有包含任何音频流,并且希望具有与输入格式相同的输出格式(此处为MP4)。
上述命令转码音频,因为MP4不能携带PCM音频流。如果需要,可以使用任何其他所需的音频编解码器,更多信息,请参阅AAC Encoding Guide。
如果您的音频或视频流较长,可以添加-shortest
选项,以便一个文件结束后ffmpeg将停止编码。
2、合并音频和视频,复制音频(不需要重新编码)
如果输出容器可以处理(几乎)任何编解码器(如MKV),那么可以简单地复制音频和视频流
ffmpeg -i video.mp4 -i audio.wav -c copy output.mkv
3、合并音频和视频,替换音频流
如果输入的视频已经包含音频,并且想要替换它,需要告诉ffmpeg采取哪个音频流:
ffmpeg -i video.mp4 -i audio.wav \
-c:v copy -c:a aac -strict experimental \
-map 0:v:0 -map 1:a:0 output.mp4
map
选项使ffmpeg只使用来自第一个输入的第一个视频流和来自第二个输入的第一个音频流作为输出文件。
编码webms时也遇到了这个问题。如果音频流比视频流长,则必须剪切它。否则视频播放完时,音频继续播放,最后一个视频帧会以静止图像呈现直到音频结束。
要剪切任何一个流,可以在每个-i “file.ext”之前使用-ss [hh:mm:ss] -t [ss]。
-ss […]定义要切割的起点
-t […]以秒为单位定义段的长度
示例如下:
ffmpeg.exe -ss 00:00:10 -t 5 -i "video.mp4" -ss 0:00:01 -t 5 -i "music.m4a" -map 0:v:0 -map 1:a:0 -y out.mp4
4、音量大小更改
音量倍数
-filter:a “volume=1.5”
增加5dB
-filter:a “volume=5dB”
静音
-filter:a “volume=0”
五、安装代码
brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-chromaprint --with-decklink --with-fdk-aac --with-jack --with-libbluray --with-libbs2b --with-libcaca --with-libmodplug --with-libopenmpt --with-librist --with-librsvg --with-libsoxr --with-libssh --with-libvidstab --with-libvmaf --with-libxml2 --with-opencore-amr --with-openh264 --with-openjpeg --with-openssl --with-openssl@1.1 --with-rav1e --with-rtmpdump --with-rubberband --with-speex --with-srt --with-svt-av1 --with-tesseract --with-two-lame --with-webp --with-xvid --with-zeromq --with-zimg
此音频处理章节引用——在ffmpeg中怎么合并音频和视频文件?https://vimsky.com/article/3687.html
How to merge audio and video file in ffmpeg
ffmpeg 中文文档
https://www.drymx.com/wp-content/uploads/2021/02/ffmpeg翻译文档.pdf