FFmpeg 实现视频批量剪辑
随着课程视频的增多,需要转化几个百视频,常规操作方式已经无法满足要求了,需要实现视频自动化剪辑。
前提条件
视频剪辑功能,均使用 FFmpeg 工具完成
https://ffmpeg.org/
FFmpeg 是一个用来做视频处理的开源工具,支持视频剪辑、视频转码、视频编辑、音频处理、添加文字、视频拼接、拉流推流直播等功能。通过不同的 FFmpeg 命令可以编程完成不同的视频剪辑功能,组合编排起来,即可应对各种批量自动化的场景。
常见的视频剪辑场景主要包含以下几种:
1. 视频转码
2. 视频裁剪
3. 视频加文字
4. 视频加图片
5. 视频拼接
6. 视频加音频
7. 视频转场
8. 视频特效
9. 视频加速慢速播放
FFmpeg 命令
下文介绍了一些具体的 FFmpeg 命令,您可以本地 安装 FFmpeg 后进行测试。
// 将 MOV 视频转成 mp4 视频 ffmpeg -i input.mov output.mp4
// 将原视频的帧率修改为 24 ffmpeg -i input.mp4 -r 24 -an output.mp4
// 将 mp4 视频转为可用于直播的视频流 ffmpeg -i input.mp4 -codec: copy -bsf:v h264_mp4toannexb -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8
// 给视频添加文字,例如字幕、标题等。 // `fontfile`是要使用的字体的路径,`text`是您要添加的文字, // `fontcolor`是文字的颜色,`fontsize`是文字大小,`box`是给文字添加底框。 // `box=1`表示 enable,`0`表示 disable,`boxcolor`是底框的颜色,black@0.5 表示黑色透明度是 50%,`boxborderw`是底框距文字的宽度 // `x`和`y`是文字的位置,`x`和`y`不只支持数字,还支持各种表达式,具体可以去官网查看 ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/font.ttf:text='您的文字':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2" -codec:a copy output.mp4
// 给视频添加图片,例如添加 logo、头像、表情等。filter_complex 表示复合的滤镜,overlay 表示表示图片的 x 和 y,enable 表示图片出现的时间段,从 0-20 秒 ffmpeg -i input.mp4 -i avatar.JPG -filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p -c:a copy output.mp4
// 视频拼接,list.txt 里面按顺序放所有要拼接的视频的文件路径,如下。 // 注意,如果视频的分辨率不一致会导致拼接失败。 ffmpeg -f concat -safe 0 -i list.txt -c copy -movflags +faststart output.mp4 // list.txt 的格式如下 file 'xx.mp4' file 'yy.mp4'
// 视频加音频,stream_loop 表示是否循环音频内容,-1 表示无限循环,0 表示不循环。shortest 表示最短的 MP3 输入流结束时完成编码。 ffmpeg -y -i input.mp4 -stream_loop -1 -i audio.mp3 -map 0:v -map 1:a -c:v copy -shortest output.mp4
以上参考文档:
https://cloud.tencent.com/document/product/583/71692
具体实操:
1、下载动作
下载地址:https://ffmpeg.org/download.html
找到合适自己电脑的版本下载:

点击下载这个:

具体的软件目录:Bin 目录

需要将该目录加到系统的环境变量里面:

检查是否配置成功:
输入:ffmpeg -version

看到版本信息就说明安装好了。
基础使用:
1、修改视频尺寸:
ffmpeg -i input.mp4 -vf "scale=960:540" output.mp4
-vf "scale=960:540":视频滤镜设置分辨率 保持宽高比:scale=960:-1(高度自动计算)

可正常执行。
2、转化格式
ffmpeg -i input.mp4 output.avi
ffmpeg -i input.vob -c:v libx264 -c:a aac -strict experimental output.mp4
-c:v libx264:使用H.264视频编码
-c:a aac:使用AAC音频编码
3、视频切割
# 切割时间段 (00:00:00 - 00:30:00) ffmpeg -i input.mp4 -ss 00:00:00 -to 00:30:00 -c copy part1.mp4 # 使用-t指定时长 (30分钟) ffmpeg -i input.mp4 -ss 00:00:00 -t 1800 -c copy part1.mp4
-c copy:不重新编码,直接复制原始视频和音频流(速度快,无损,但无法剪切精确到帧)。
ffmpeg -i input.mp4 -ss 00:15:30 -t 00:05:00 -c:v libx264 -c:a aac segment.mp4
适用于非关键帧位置切割
会重新编码,质量略有损失
4、视频转GIF
ffmpeg -i 密室6.mp4 -ss 431 -to 442 -vf "fps=10,scale=640:-1" -c:v gif video1.gif
-ss 431:从431秒开始 -to 442:到442秒结束 fps=10:帧率10帧/秒 scale=640:-1:宽度640px,高度自动计算
# `-loop 0`:无限循环 ffmpeg -i "水果缤纷.mp4" -ss 00:00:20 -to 00:00:28 -vf "fps=10,scale=640:-1" -loop 0 output.gif
高级应用:
1、视频拼接
# 创建文件列表 echo "file 'clip1.mp4'" > list.txt echo "file 'clip2.mp4'" >> list.txt # 拼接视频 ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
2、添加水印
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4
在右下角添加水印(距离边缘10px)
实用技巧:
快速切割:使用 -c copy 避免重新编码,速度极快 批量处理:结合批处理脚本或PowerShell自动化任务 硬件加速:使用 -hwaccel cuda 或 -hwaccel dxva2 加速处理 格式探测:使用 ffprobe input.mp4 查看媒体详细信息 性能监控:添加 -report 参数生成处理日志
参考文档:
https://blog.csdn.net/qq_56591814/article/details/144864353
我的实操:
1、截取视频
ffmpeg -ss 00:00:30 -i input.mp4 -t 30 -c copy output.mp4
几乎无损截取视频。
2、删除片头
ffmpeg -i input.mp4 -ss 00:00:10 -c:v copy -c:a copy -an output-1.mp4
这种方式相当于删除前10秒,但是不会重新编码,也就意味着:20秒的视频,删除前10秒,总视频还是20秒,前10秒是定格,然后从第10秒后开始进行播放。
ffmpeg -i input.mp4 -ss 00:00:10 -c:v libx264 -c:a aac -map 0 output-2.mp4
-c:v libx264:重新编码视频为H.264格式。 -c:a aac:重新编码音频为AAC格式。 缺点:速度较慢,但能精确到指定时间点。
这种方式是:删除视频前10秒,然后通过H.264进行重新编码
可以使用-noaccurate_seek(快速但可能不精确)
ffmpeg -i input.mp4 -ss 00:00:10 -noaccurate_seek -c:v copy -c:a copy output.mp4
-noaccurate_seek:牺牲精度换取速度(不推荐)。
3、windows批量去除片头片尾
@echo off setlocal enabledelayedexpansion set "start_time=00:00:10" // 片头10秒 set "end_offset=5" // 片尾5秒 mkdir output 2>nul for %%i in (*.mp4 *.avi) do ( for /f "tokens=2-5 delims=:." %%a in ('ffmpeg -i "%%i" 2^>^&1 ^| find "Duration:"') do ( set /a "total_seconds=(1%%a %% 100 * 3600) + (1%%b %% 100 * 60) + (1%%c %% 100)" set /a "end_seconds=total_seconds - !end_offset!" set /a "h=end_seconds/3600, m=(end_seconds%%3600)/60, s=end_seconds%%60" set "end_time=!h!:!m!:!s!" ffmpeg -i "%%i" -ss %start_time% -to %end_time% -c:v copy -c:a copy "output\%%i" ) )
4、windows批量给视频添加片头片尾
@echo off setlocal enabledelayedexpansion :: 设置片头和片尾文件路径 set "intro=intro.mp4" set "outro=outro.mp4" :: 创建输出文件夹 mkdir output 2>nul :: 遍历当前目录下的所有视频文件 for %%i in (*.mp4 *.avi *.mkv) do ( echo 正在处理: %%i :: 临时合并片头和主视频 set "temp_file=temp_%%~ni.mp4" ffmpeg -i "%%i" -i "%intro%" -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" "output\!temp_file!" :: 合并临时文件和片尾 ffmpeg -i "output\!temp_file!" -i "%outro%" -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" "output\%%~ni_final.mp4" :: 删除临时文件(可选) del "output\!temp_file!" ) echo 所有视频处理完成! pause
5、批量给视频添加片头
@echo off for %%i in (*.mp4) do ( ffmpeg -i piantou.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts -y ffmpeg -i %%i -vcodec copy -acodec copy -vbsf h264_mp4toannexb 3.ts -y ffmpeg -i "concat:1.ts|3.ts" -acodec copy -vcodec copy -absf aac_adtstoasc %%~ni.mp4 -y echo %%~ni.mp4 )
使用方法:将脚本保存为trim.bat文件,放到视频文件夹,双击运行。
打完收工!

浙公网安备 33010602011771号