FFmpeg工具套件
常用命令
1. 查看视频信息
ffmpeg -i input.mp4
或者
ffprobe -i input.mp4
输出信息如下:
ffmpeg version 4.2.3 Copyright © 2000-2020 the FFmpeg developers
built with Apple clang version 11.0.3 (clang-1103.0.32.59)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.2.3 --enable-shared
–enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags=-fno-stack-check --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘video.mp4’:
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.71.100 Duration: 00:00:16.93, start: 0.000000, bitrate: 1107 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x1280 [SAR 1:1 DAR 9:16], 970 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
(default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 127 kb/s (default)
Metadata:
handler_name : SoundHandler
2. 视频抽帧保存成图片
ffmpeg -i input.mp4 ./input/out-%03d.png
ffmpeg -i input.mp4 -q:v 2 -f image2 ./input/%03d.jpeg
注:需先创建指定的文件夹
3. 计算视频总帧数
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
4. 视频fps转化(转为24,总时长不变)
ffmpeg -i input.mp4 -r 24 -y output.mp4
5. 列出支持的编解码器
ffmpeg -decoders
ffmpeg -encoders
6. 列出支持的gpu编解码器
ffmpeg -decoders | grep cuvid
ffmpeg -encoders | grep nvenc
7. 加水印
ffmpeg -i input.mp4 -c:v libx264 -b:v 4000k -c:a copy -vf "movie=logo.png,scale= 60: 30[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] " -y output.mp4
ffmpeg -i input.mp4 -c:a copy -vf "movie=logo.png,scale= 120: 60[watermark];[in][watermark] overlay=x=10:main_h-overlay_h-10[out] " -y output.mp4
在视频左下角添加图片水印:
ffmpeg -i input.mp4 -i logo.png -filter_complex 'overlay=x=10:y=main_h-overlay_h-10’ output.mp4
在视频右下角添加图片水印:
ffmpeg -i input.mp4 -i logo.png -filter_complex 'overlay=main_w-overlay_w-10:main_h-overlay_h-10' output.mp4
ffmpeg -i input.mp4 -vf “movie=logo.png[watermark];[in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] “ output.mp4
利用GPU编码加水印:
ffmpeg -i input.mp4 -c:a copy -vf "movie=logo.png[watermark];[in][watermark] overlay=x=15:main_h-overlay_h-15[out] " -c:v h264_nvenc -y output.mp4
ffmpeg -i input.mp4 -c:a copy -vf "movie=logo.png,scale=w=2/3*iw:h=2/3*ih[watermark];[in][watermark] overlay=x=15:main_h-overlay_h-15[out] " -c:v h264_nvenc -y output.mp4
注:
-i :一般表示输入
input.mp4:这里表示要处理的视频源
-vf:滤镜相关,视频裁剪,水印等等操作都需要它完成
logo.png: 要添加的水印图片地址
overlay:水印参数
main_w-overlay_w-10:水印在x轴的位置,也可以写成x=main_w-overlay_w-10
main_h-overlay_h-10:水印在y轴的位置
-filter_complex:相比-vf, filter_complex适合开发复杂的滤镜功能,如同时对视频进行裁剪并旋转。参数之间使用逗号隔开。
main_w:视频宽度
overlay_w: 要添加的图片水印宽度
main_h : 视频高度
overlay_h:要添加的图片水印宽度
8. 实现2秒后logo从左到右移动
ffmpeg -i input.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)'” output.mp4
9. 实现每隔10秒交替出现logo
ffmpeg -y -t 60 -i input.mp4 -i logo1.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10” output.mp4
10. 去水印
ffmpeg -i Mojito.mp4 -vf delogo=x=950:y=10:w=300:h=100:show=0 out.mp4
其中x/y/w/h是水印方框坐标,show=0是不显示水印处理边框
11. 从图片序列合并视频
图片路径保存在list_of_output_files.txt中
ffmpeg -y -loglevel error -f concat -safe 0 -i list_of_output_files.txt -vcodec copy output.mp4
图片格式统一,均在同一个文件夹中
ffmpeg -r 24 -pattern_type glob -i 'output/*.jpg' -c:v libx264 output.mp4
12. 合并视频
横向合并视频
(Cpu) ffmpeg -i input1.mp4 -i input2.mp4 -lavfi hstack -y output.mp4
(Gpu) ffmpeg -c:v h264 -i input1.mp4 -c:v h264 -i input2.mp4 -lavfi hstack -c:v h264_nvenc -y output.mp4
纵向合并视频
ffmpeg -i input1.mp4 -i input2.mp4 -lavfi vstack -y output.mp4
合并多个视频
如果希望合并多个视频,可以使用下面命令行:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -lavfi hstack=inputs=3 output.mp4
其中input=3表示希望合并的视频的个数。
13. 转码
GPU转码h264视频(h264_cuvid)到h264(h264_nvenc)
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2048k -y output-gpu.mp4
GPU转码mp4v视频(mpeg4_cuvid)到h264(h264_nvenc)
ffmpeg -hwaccel cuvid -c:v mpeg4_cuvid -i input-mp4v.mp4 -c:v h264_nvenc -b:v 2048k -y output-gpu.mp4
CPU转码h264视频(libx264)到h264(libx264)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2048k -vf scale=1280:-1 -y output-cpu.mp4
从rawvideo到h264,Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (h264_nvenc))
ffmpeg -hwaccel cuvid -i input_rawvideo.mp4 -c:v h264_nvenc -vf scale=720:1280 -y output-gpu.mp4
其他:
ffmpeg -i input.mp4 -c:v libx264 -b:v 2048k -vf scale=1280:-1 -y output-cpu.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y output-gpu.mp4
ffmpeg -i input.mp4 -c:v h264_nvenc -preset default output-gpu.mp4
14. 截取视频某一部分
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
- -ss:指定从什么时间开始
- -t:指定需要截取多长时间
- -i:指定输入视频文件
15. 连接两个和多个同样分辨率的视频片段
# 两个
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex concat=n=2:v=1 output.mp4
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v] [0:a] [1:v] [1:a] concat=n=2:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" output.mp4
# 多个
## 将所有视频名写入video.txt中,例如:
file '1.mp4'
file '2.mp4'
file '3.mp4'
file '4.mp4'
file '5.mp4'
## 执行连接脚本:
ffmpeg -f concat -i video.txt -c copy output.mp4
16. 调整尺寸
ffmpeg -i video_large.mp4 -s 256x256 -c:a copy video_256.mp4
17. 查看支持的转换格式
ffmpeg -pix_fmts
18. 展示帧类型
ffprobe -select_streams v -show_frames -show_entries frame=pict_type test.mp4
或
ffprobe -i test.mp4 -show_frames | grep 'pict_type'
结果示例:
[FRAME]
pict_type=I
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=B
[/FRAME]
[FRAME]
pict_type=P
[/FRAME]
19. 拷贝部分流到新的视频中
使用copy:
ffmpeg -i input0.avi -c:v copy -i input1.mp4 -c:a copy output.mkv
- 注:将input0.avi的Video Stream和input1.mp4的Audio Stream拷贝到output.mkv中。
使用map:
ffmpeg -i input0.mp4 -i input1.mkv -map 0:0 -map 1:3 output.mp4
- 注:将input0.mp4的Stream 0和input1.mkv的Stream 3拷贝到output.mp4中。
更多map的使用方式见参考资料[10]。
20. 对视频左旋90度或者右旋90度
使用CPU编解码做视频旋转
将视频左旋 90 度:
ffmpeg -i test_video.mp4 -vf "transpose=2" output_video_left_rotate.mp4
将视频向右旋转 90 度:
ffmpeg -i test_video.mp4 -vf "transpose=1" output_video_right_rotate.mp4
使用GPU编解码做视频旋转
将视频左旋 90 度:
(以使用7号GPU为例,device_id=7)
ffmpeg -y -hwaccel cuda -hwaccel_device 7 -i test_video.mp4 -c:v h264_nvenc -vf "transpose=2" -y output_video_left_rotate.mp4
将视频向右旋转 90 度:
ffmpeg -y -hwaccel cuda -hwaccel_device 7 -i test_video.mp4 -c:v h264_nvenc -vf "transpose=1" -y output_video_right_rotate.mp4
FFplay
播放一次后自动退出
ffplay -autoexit test.mp4
以指定窗口大小播放
ffplay -x 1280 -y 720 test.mp4
设置窗口标题并循环播放
ffplay -window_title test_window -loop 3 test.mp4
注:‘-loop number’ 为循环播放 ,number为0将一直循环。
版权说明
本文为原创文章,独家发布在blog.csdn.net/TracelessLe。未经个人允许不得转载。如需帮助请email至tracelessle@163.com。
参考资料
[1] FFmpeg官网
[2] 使用GPU硬件加速FFmpeg视频转码
[3] Use FFmpeg to Decode H.264 Stream with NVIDIA GPU Acceleration
[4] 使用ffmpeg给视频添加图片及文字水印
[5] ffmpeg视频剪切与合并
[6] 使用FFmpeg合并音视频
[7] FFmpeg 视频处理入门教程
[8] 知乎 - 如何用ffmpeg合并音频和视频?
[9] FFmpeg之ffplay命令使用
[10] Map – FFmpeg
[11] FFmpeg Wiki