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

找到合适自己电脑的版本下载:

image

点击下载这个:

image

具体的软件目录:Bin 目录

image

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

image

检查是否配置成功:

输入:ffmpeg -version

image

看到版本信息就说明安装好了。

基础使用:

1、修改视频尺寸:

ffmpeg -i input.mp4 -vf "scale=960:540" output.mp4
-vf "scale=960:540":视频滤镜设置分辨率
保持宽高比:scale=960:-1(高度自动计算)

image

可正常执行。

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文件,放到视频文件夹,双击运行。

打完收工!

posted @ 2025-10-16 11:57  帅到要去报警  阅读(368)  评论(0)    收藏  举报