最近对于音视频和图像的处理问题比较感兴趣,但发现很多目前需要的功能要么需要付费但不会过于麻烦,要么比较麻烦,很可能某个功能实现需要安装很多软件
例如,视频转GIF动图,该功能的实现要么使用Photoshop全家桶,要么找在线网站,或者是wps充会员,或者找其它方法,但其实FFMPEG这个软件就可以搞定一切了。
那么,选择FFMPEG的理由有哪些呢?
第一,FFMPEG可以跨平台,也就是mac,Linux,windows都可以部署使用,甚至可以使用dockers这样的容器,当然了,在Linux下如果有批量剪辑音视频的需求,会非常方便,虽然可能需要编写脚本
第二,FFMPEG是一个开源的,自由的软件,没有那些使用上的限制,当然,我们在使用的时候还是需要尊重一下软件开源协议
第三,FFMPEG的功能是非常非常多的,可以剪辑音视频,视频转换为图片,图片剪辑,音频混响,音视频的抽取替换,字幕,还有一些不是太常规的功能,比如,录屏,摄像头视频抓取,麦克风音频抓取等等功能;同时,FFMPEG所支持的音视频格式非常多,基本95%的格式都可以支持,除了一些个别的收费格式,例如mflac音频文件这样的不支持。
也是由于FFMPEG的这些强大功能,可以在很多地方大显身手,比如,平常的娱乐方面,动图制作;摄像头的视频流抓取配合人工智能识别;短视频的剪辑制作;音视频的大规模清洗;音视频的翻拍;电子相册,相册转换成视频 等等落地场景,场景多样,就看你的想象力有多好了吧!!!!
那么,这么强大的开源的音视频和图片处理工具自然是不可能一篇文章就讲清楚了,本文将主要就FFMPEG遮挡水印,GIF类型的动图制作,视频内的音频抽取,替换这几个简单的功能做一个讲解。
一,
音视频格式转换
音视频和图片的格式是非常多的,这里我就不废话太多了,只说一下常用的,比如,视频的mov,avi,mp4,ts,mkv,rmvb等等格式;音频的flac,mp3,wma,ape,acc,ogg等等格式;图片的GIF,PNG,SWF,BPM,JPG等等格式
那么,废话这么半天是想说格式对应于文件的编码格式,比如,某个电影视频,它的格式是rmvb,这时候指的的是它的编码格式,那么,我要在Windows播放这个视频,是需要有解码这个编码格式的解码器的软件才可以播放,也就是具有rmvb解码器或者称之为解码引擎,解码库的软件,例如Windows media 播放器或者vlc播放器这样的具有相应解码器的播放器才可以播放
当然了,FFPLAY基本没有这种困扰,95%的文件格式都可以轻松播放,,现在可以聊一聊文件格式转换的问题了
FFMPEG的音视频文件格式转换非常简单,ffmpeg -i 原始音视频文件 转换后的音视频文件 就这么简单粗暴,例如,flac文件转换成MP3文件:
其它的格式转换基本都是这样的,没有什么技巧可言
二,
音视频抽取
例如,原视频是电影武侠,时长1小时57分钟
截取自41分钟0秒开始之后的20秒视频,抽取的视频同时转换成mp4格式:
ffmpeg -i "C:\Users\Administrator\Desktop\武侠 (2011)导演陈可辛 编剧林爱华 主演甄子丹 金城武 汤唯 王羽 惠英红李小冉姜武类型剧情动作悬疑武侠.rmvb" -ss 41:00 -t 20 D:\test2.mp4
可以看到,抽取的视频确实是20秒
rmvb视频转换成rmvb视频需要强制转换,指定转换格式,强制转换可能会有失败的风险
增加-f 格式即可,例如下面的命令也是可以的:
ffmpeg -i "C:\Users\Administrator\Desktop\武侠 (2011)导演陈可辛 编剧林爱华 主演甄子丹 金城武 汤唯 王羽 惠英红李小冉姜武类型剧情动作悬疑武侠.rmvb" -y -ss 41:00 -t 20 -f mpeg D:\test2.rmvb
ffmpeg -i "C:\Users\Administrator\Desktop\武侠 (2011)导演陈可辛 编剧林爱华 主演甄子丹 金城武 汤唯 王羽 惠英红李小冉姜武类型剧情动作悬疑武侠.rmvb" -y -ss 41:00 -t 20 -f mpeg D:\test2.mpeg
音频文件的转换相对简单:
ffmpeg -i 222.mp3 333.wav
输出如下:
C:\Users\Administrator\Desktop\11111>ffmpeg -i 222.mp3 333.wav
ffmpeg version 6.1.1-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
Input #0, mp3, from '222.mp3':
Metadata:
title : 有没有人告诉你
album : 相爱十年 电视剧原声带
artist : 陈楚生
ID : 8597091334
track : 1
disc : 1
encoder : Lavf60.16.100
Duration: 00:04:21.15, start: 0.025056, bitrate: 145 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
Metadata:
encoder : Lavc60.31
Stream #0:1: Video: png, rgb24(pc, gbr/unknown/unknown), 500x500 [SAR 1:1 DAR 1:1], 90k tbr, 90k tbn (attached pic)
Metadata:
comment : Other
Stream mapping:
Stream #0:0 -> #0:0 (mp3 (mp3float) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, wav, to '333.wav':
Metadata:
INAM : 有没有人告诉你
IPRD : 相爱十年 电视剧原声带
IART : 陈楚生
ID : 8597091334
IPRT : 1
disc : 1
ISFT : Lavf60.16.100
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Metadata:
encoder : Lavc60.31.102 pcm_s16le
[out#0/wav @ 0000017891270640] video:0kB audio:44982kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000382%
size= 44982kB time=00:04:21.09 bitrate=1411.3kbits/s speed= 748x
使用ffprobe命令查看是否转换成功:
C:\Users\Administrator\Desktop\11111>ffprobe -i 333.wav
ffprobe version 6.1.1-full_build-www.gyan.dev Copyright (c) 2007-2023 the FFmpeg developers
built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 --enable-d3d11va --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
Input #0, wav, from '333.wav':
Metadata:
artist : 陈楚生
title : 有没有人告诉你
album : 相爱十年 电视剧原声带
track : 1
encoder : Lavf60.16.100
Duration: 00:04:21.12, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
音频转码:
ffmpeg -i "C:\Users\Administrator\Desktop\Music\陈楚生 - 有没有人告诉你.flac" -c:a libmp3lame -q:a 6 D:\chen.mp3 #音频转码 ,最高等级的
视频内的音频抽取:
vn表示去掉视频,视频去掉了自然就剩下音频了
an表示去掉音频,音频去掉了自然就剩下视频了,an就不演示了
ffmpeg -i D:\555.mp4 -vn D:\333.mp4 #提取音频,可以提取为mp3,也可以mp4
ffmpeg -i D:\555.mp4 -c:v copy -vn D:\333.mp3 -y ###仍然是提取音频,和上面的没什么太大区别
ffmpeg -i D:\555.mp4 -map 0 -map 0:a:1 -copy D:\333.mp3###仍然是提取音频,和上面的没什么太大区别
ffmpeg -i D:\555.mp4 -an D:\333.mp4 #提取视频
ffmpeg -i "C:\Users\Administrator\Desktop\武侠 (2011)导演陈可辛 编剧林爱华 主演甄子丹 金城武 汤唯 王羽 惠英红李小冉姜武类型剧情动作悬疑武侠.rmvb" -vn D:\wuxia.mp3
###提取电影武侠里的所有音频
三,
动图的制作
ffmpeg -i D:\666.mp4 -ss 00:20 -t 12 -r 10 -s 320*250 D:\888.gif -y #截取视频并转换成动图
以上命令是截取666.mp4,从视频的20秒开始,往后接12秒,动图质量为10,动图大小为320*250 ,保存路径为D盘,如果有同名的888.gif文件直接覆盖
这里的-t 可以精确到毫秒,比如-t 12.7 表示12秒零70毫秒,这样也是的
经过实践,可以发现,如果视频直接转动图,动图会很大,因为是保留视频的画面大小了,因此,必须-s参数指定GIF的画面大小
由于GIF动图一般是做表情图使用,一般大小不宜超过2M,制作的时候一般是截取视频的十来秒内容即可,太多也没有必要了。
四,
替换视频内的音频
ffmpeg -i D:\222.mp4 -i D:\chen.mp3 -c copy -map 0:v:0 -map 1:a:0 -shortest D:\test.mp4 -y #222.mp4这个视频有音频的,直接替换
-map 0:v:0代表视频 -map 1:a:0 代表音频 -c copy 表示仅拷贝,不做任何转码
ffmpeg -i D:\222.mp4 -i D:\chen.mp3 -c copy -map 0:v:0 -map 1:a:0 -c:a libmp3lame -q:a 6 -shortest D:\test.mp4 -y
###音频重新编码,质量6 最高6,chen.mp3是一首完整的歌曲,222.mp4是十几秒的视频,音频的时间和视频的时间一致裁剪
-c:a libmp3lame -q:a 6表示音频做转码,转码为MP3,质量等级最高,也就是音质最好,6是最高等级,1是最低等级