You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于CSV中的时间戳使用FFmpeg对视频指定分段进行10倍加速?

如何基于CSV中的时间戳使用FFmpeg对视频指定分段进行10倍加速?

当然可以实现!这其实是FFmpeg滤镜链的典型应用,我们可以通过解析CSV里的时间戳,生成对应的变速滤镜片段,再把所有片段按顺序拼接起来。下面是具体的操作步骤:

1. 预处理你的CSV文件

首先先清理下你提供的CSV,去掉每行末尾多余的逗号,确保每行是start, end的标准格式,处理后的CSV如下:

start, end
00:00:03.296, 00:00:14.372
00:00:16.388, 00:00:33.635
00:00:33.693, 00:00:39.428
00:00:39.460, 00:00:50.355
00:00:50.355, 00:01:17.892
00:01:17.892, 00:01:19.845
00:01:19.845, 00:01:47.616

另外要注意时间线的连续性:视频开头到第一个加速片段的起始点、每个加速片段的结束点到下一个加速片段的起始点、最后一个加速片段结束点到视频结尾,这些都是需要保持原速的部分。

2. 手动构建FFmpeg命令(适合少量片段)

如果你的加速片段不多,可以手动拼接滤镜链。假设你的输入视频是input.mp4,输出视频是output.mp4,核心思路是:

  • 用trim截取视频片段,atrim对应截取音频片段
  • 加速片段用setpts=PTS/10实现视频10倍速,音频用atempo叠加实现10倍速(因为单个atempo仅支持0.5-2的变速范围,所以用atempo=2.5,atempo=2,atempo=2凑出10倍)
  • 原速片段用setpts=PTS-STARTPTS和asetpts=PTS-STARTPTS保持原时间戳
  • 最后用concat滤镜把所有片段按顺序拼接

示例命令(简化展示前3个片段的处理):

ffmpeg -i input.mp4 -filter_complex "\
[0:v]trim=start=0:end=00:00:03.296,setpts=PTS-STARTPTS[v0];\
[0:a]atrim=start=0:end=00:00:03.296,asetpts=PTS-STARTPTS[a0];\
[0:v]trim=start=00:00:03.296:end=00:00:14.372,setpts=PTS/10[v1];\
[0:a]atrim=start=00:00:03.296:end=00:00:14.372,atempo=2.5,atempo=2,atempo=2[a1];\
[0:v]trim=start=00:00:14.372:end=00:00:16.388,setpts=PTS-STARTPTS[v2];\
[0:a]atrim=start=00:00:14.372:end=00:00:16.388,asetpts=PTS-STARTPTS[a2];\
[v0][a0][v1][a1][v2][a2]concat=n=3:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4

3. 自动化生成命令(适合大量片段)

如果CSV里的片段很多,手动写命令太繁琐,可以用一个简单的Python脚本自动解析CSV并生成完整的FFmpeg命令:

import csv

# 配置参数
input_video = "input.mp4"
output_video = "output.mp4"
speed_factor = 10  # 加速倍数

# 生成音频变速的atempo链(适配FFmpeg的atempo范围限制)
atempo_chain = []
remaining_speed = speed_factor
while remaining_speed > 2:
    atempo_chain.append("2")
    remaining_speed /= 2
atempo_chain.append(str(remaining_speed))
atempo_filter = ",".join(f"atempo={x}" for x in atempo_chain)

# 读取CSV中的时间戳
segments = []
with open("timestamps.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        start_time = row['start'].strip()
        end_time = row['end'].strip()
        segments.append((start_time, end_time))

# 构建滤镜片段
filter_components = []
last_timestamp = "00:00:00.000"
video_idx = 0
audio_idx = 0

# 遍历每个加速片段,插入对应的原速+加速片段
for start, end in segments:
    # 添加原速片段:从上次结束时间到当前加速片段的起始时间
    filter_components.append(f"[0:v]trim=start={last_timestamp}:end={start},setpts=PTS-STARTPTS[v{video_idx}];")
    filter_components.append(f"[0:a]atrim=start={last_timestamp}:end={start},asetpts=PTS-STARTPTS[a{audio_idx}];")
    video_idx += 1
    audio_idx += 1
    # 添加加速片段:当前加速片段的时间范围
    filter_components.append(f"[0:v]trim=start={start}:end={end},setpts=PTS/{speed_factor}[v{video_idx}];")
    filter_components.append(f"[0:a]atrim=start={start}:end={end},{atempo_filter}[a{audio_idx}];")
    video_idx += 1
    audio_idx += 1
    last_timestamp = end

# 添加最后一段原速片段:从最后一个加速片段结束到视频结尾
filter_components.append(f"[0:v]trim=start={last_timestamp},setpts=PTS-STARTPTS[v{video_idx}];")
filter_components.append(f"[0:a]atrim=start={last_timestamp},asetpts=PTS-STARTPTS[a{audio_idx}];")
video_idx += 1
audio_idx += 1

# 构建concat拼接部分
concat_inputs = []
for i in range(video_idx):
    concat_inputs.append(f"[v{i}][a{i}]")
concat_filter = "".join(concat_inputs) + f"concat=n={video_idx}:v=1:a=1[v][a]"

# 拼接完整的滤镜链
full_filter_complex = "".join(filter_components) + concat_filter
# 生成最终的FFmpeg命令
ffmpeg_command = f'ffmpeg -i {input_video} -filter_complex "{full_filter_complex}" -map "[v]" -map "[a]" {output_video}'

# 打印命令(也可以保存到文件)
print(ffmpeg_command)

使用方法:

  • 把处理后的CSV命名为timestamps.csv,和脚本放在同一目录
  • 修改脚本里的input_video和output_video为你的实际文件路径
  • 运行脚本,复制输出的命令到终端执行即可

4. 注意事项

  • 建议使用最新版FFmpeg,避免滤镜兼容性问题
  • 如果你的FFmpeg支持rubberband滤镜(编译时需启用),可以用rubberband=tempo=10替代atempo链,音频变速更直接
  • 测试时可以先用短片段验证时间戳和变速效果,确认无误后再处理完整视频
  • 如果视频包含字幕,需要额外处理字幕的变速和拼接,这属于进阶需求,可以参考FFmpeg的subtitles或ass滤镜文档

备注:内容来源于stack exchange,提问作者tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:59:28