Blender视频条隔帧删除代码异常:误删前半段请求排查
问题排查与修复方案
核心问题分析
你的代码存在三个关键错误,导致它删除了片段前半段而非隔帧:
- 缩进语法错误:
for frame in range(...)循环后的if frame % 2 == 0语句未缩进,这在Python中会触发语法错误(若实际运行时已修复缩进,重点看后续逻辑问题)。 - 删除逻辑完全错误:通过反复增加
strip.frame_final_start来"删除"帧是错误的——frame_final_start控制的是片段在时间线上的起始播放位置,每次加1只是把片段起始点后移一帧,循环多次后相当于直接砍掉片段开头的连续帧,完全不符合隔帧删除的需求。 - 隔帧判断基准错误:用全局时间线帧号
frame判断奇偶,和片段自身的帧顺序无关。比如片段从全局帧10开始时,片段第1帧对应全局帧10(偶数),会被误标记为删除,逻辑完全混乱。
修复方案一:速度控制实现快速隔帧
通过调整播放速度和片段时长,快速实现隔帧保留(以保留奇数位置帧为例):
import bpy video_strip_name = "YourStripName" vse = bpy.context.scene.sequence_editor strip = vse.sequences.get(video_strip_name) if strip: # 计算片段在时间线上的总帧数 total_frames = strip.frame_final_end - strip.frame_final_start + 1 # 1. 设置播放速度为2,自动跳过每第二帧 strip.playback_speed = 2.0 # 2. 将片段时长改为原长度的一半(向上取整) new_duration = (total_frames + 1) // 2 strip.frame_final_end = strip.frame_final_start + new_duration - 1 print(f"隔帧删除完成,保留{new_duration}帧") else: print(f"未找到视频片段'{video_strip_name}'")
修复方案二:精准选择保留帧
如果需要更精准地控制保留哪些帧,可创建新片段并设置帧步长:
import bpy video_strip_name = "YourStripName" vse = bpy.context.scene.sequence_editor strip = vse.sequences.get(video_strip_name) if strip: # 获取原片段的内部帧范围 original_start = strip.frame_start original_end = strip.frame_end # 筛选要保留的帧(这里保留内部索引为偶数的帧,即第1、3、5...帧) keep_frames = [original_start + idx for idx in range(original_end - original_start + 1) if idx % 2 == 0] # 创建新的过滤后片段 new_strip = vse.sequences.new_movie( name=f"{video_strip_name}_filtered", filepath=strip.filepath, frame_start=strip.frame_final_start, channel=strip.channel + 1 ) # 设置新片段的内部帧范围和步长 new_strip.frame_start = keep_frames[0] new_strip.frame_end = keep_frames[-1] new_strip.frame_step = 2 # 静音原片段 strip.mute = True print("已生成过滤后的新片段,原片段已静音") else: print(f"未找到视频片段'{video_strip_name}'")
关键概念说明
playback_speed:设置为2.0时,视频以2倍速度播放,自动跳过每第二帧,配合修改时长可让时间线片段长度减半。frame_step:控制片段播放时的帧间隔,设置为2会只播放指定帧范围内的奇数/偶数帧(取决于索引起始)。
内容的提问来源于stack exchange,提问作者Jatin
相关产品推荐
相关产品推荐

