经常会用到ffmpeg进行各种视频处理操作,虽然没有深入看ffmpeg的底层代码实现,但是已经明显的感受到了其强大。
- 进行视频分割:
ffmpeg -ss 00:00:00 -t 00:00:30 -i example.ts -vcodec copy -acodec copy output.mp4
解析:-i 命令表示输入,后边的example.ts为待处理视频;-ss 表示分割视频的起始时间点,xx:xx:xx表示时:分:秒; -t分割的视频长度;-vcodec copy -acodec copy表示音视频不进行重新编码,直接拷贝。
- 进行视频合成:
将多段同样编码格式的视频进行简单的视频拼接可以使用以下命令:
ffmpeg.exe -i "concat:1.ts|2.ts|3.ts" -vcodec copy -acodec copy output.ts
解析:视频拼接的关键字为concat,将待拼接的视频使用concat和符号 | 按照以上格式进行书写,即可实现简单的视频拼接,此处仍然没有进行音视频的重新编码。当然,也可以把需要拼接的文件名单独放到一个文本文件进行读取:
# input.txt
file 'frag_1.ts'
file 'frag_2.ts'
# ffmpeg拼接命令
ffmpeg -f concat -i input.txt -c copy output.flv
如果格式等不同时,比如封装格式、编码方式、帧率等有差别时,可以分别编码为统一的ts格式:
ffmpeg -i demo.mp4 -c:v libx264 -s 640x360 -r 24 -profile:v main -c:a libfdk_aac -ar 44100 -ac 2 -profile:a aac_he_v2 format_demo.ts
- 视音频分离:
ffmpeg -i clip_download.mp4 -an -vcodec copy clip_download.hevc
ffmpeg -i clip_download.mp4 -acodec copy -vn clip_download.ac3
解析:上述两条命令分别得到了分离后的视频和音频;在获取视频时,使用了-vcodec copy -an 命令,其中的-an命令表示禁止音频,因此只得到视频信息;在获取音频时,类似使用了-acodec copy -vn,表示音频编码保持,视频禁止,因此只得到音频信息。
- 视音频合成:
ffmpeg -i convert_download.hevc -i clip_download.ac3 -vcodec copy -acodec copy output.mp4
解析:该命令只是应对单音轨视频进行视音频合成。使用-i命令分别输入音视频源,视音频copy后直接输出合成的文件。
- 每隔xx帧提取一张图片
ffmpeg -i logo.mp4 -vf "select=between(n\,10\,100)*not(mod(n\,4))" -vsync 0 ./pkl/image-3%d.jpg
-vf: 视频滤镜
between(n\, 10, 100):视频处理范围在第10~100帧内 ;
not(mod(n\, 4):每隔4帧截取一张图片
-vsync: 视频同步方法;0 表示透传,即每一帧保持时间戳不变,从demuxer透传至muxer;1表示cfr,固定帧率;
- 图片序列导出webm格式视频
编解码器使用libvpx-vp9;-lossless为无损编码,-crf为控制编码质量的参数,越小编码质量越高
ffmpeg -f image2 -framerate 30 -i mojito_%3d.png -c:v libvpx-vp9 -lossless 1 mojito.webm
ffmpeg -f image2 -framerate 30 -i mojito_%3d.png -c:v libvpx-vp9 -crf 18 mojito.webm
ffmpeg -framerate 25 -f image2 -i mojito_%3d.png -c:v libvpx-vp9 -pix_fmt yuva420p output.webm
- webm转MP4
ffmpeg -i output.webm output.mp4
// webm转灰度mp4
ffmpeg -i output.webm -pix_fmt gray output_gray.mp4
- 多路视频拼接
ffmpeg -i output_gray.mp4 -i output.mp4 -filter_complex "[0:v]pad=iw*2:ih[a];[a][1:v]overlay=w*1" -pix_fmt yuv420p out.mp4
- 烧制硬字幕
ffmpeg -i input.mkv -vf subtitles=xxx.srt output.mkv #字幕格式为srtffmpeg -i input.mkv -vf ass=xxx.ass output.mkv $字幕格式为ass
硬字幕是直接内嵌到视频中的。昨天想用电视看下载的原生格式电影,但是没有字幕,所以就用ffmpeg加了个内嵌字幕,srt格式的亲测有效~
注:在使用ffmpeg时,需要注意了解相应的视音频格式是否被ffmpeg支持,否则并不能达到预期的效果。
- ffmpeg去水印
ffmpeg -i logo.mp4 -vf delogo=x=180:y=920:w=210:h=35 delogo.mp4
这里-vf表示视频滤镜;delogo后跟x:y:w:h 四个参数,分别表示滤镜作用区域的位置坐标及宽高;show=1会绘制一个上述的绿色长方形区域,用于帮助更好的确定编辑位置;正式导出文件时,可以将其设置为
仅供参考:https://ffmpeg.org/ffmpeg.html