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

基于Python的自动化TikTok视频编辑脚本TypeError报错求助

问题:FFmpeg-Python TypeError 及 TikTok视频自动化编辑脚本修复

问题背景

编写Python脚本实现以下功能:监控指定文件夹的新MP4文件,自动将其转换为TikTok适配的9:16(1080x1920)格式——原视频保持宽高比居中显示,背景为拉伸铺满画布并添加高斯模糊的原视频副本;处理完成后将编辑好的视频存入指定目录,原文件移至存档文件夹。运行脚本时出现TypeError,此前还存在运行无反应且无报错的情况。

报错信息

TypeError: Expected incoming stream(s) to be of one of the following types: ffmpeg.nodes.FilterableStream; got <class 'str'>

问题根源与修复方案

1. TypeError核心原因

overlay滤镜的第二个参数传入了字符串格式的文件路径input_video,但FFmpeg-Python要求必须传入FFmpeg流对象,而非文件路径。需要为原视频单独创建输入流,处理后再与背景流叠加。

2. 其他潜在问题修复

  • 文件写入未完成即触发处理:新增文件大小稳定检查,避免在文件下载/复制过程中就执行FFmpeg处理,导致无反应或处理失败。
  • 路径拼接错误:修正shutil.move的目标路径,避免生成无效路径。
  • 视频处理逻辑优化:确保原视频保持宽高比居中,背景视频正确拉伸模糊,贴合TikTok格式需求。
  • 时间裁剪逻辑修正:移除原不符合FFmpeg-Python规范的trim参数,如需裁剪可调整为正确格式。

修复后的完整代码

import os
import shutil
import ffmpeg
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# 配置路径
MONITOR_PATH = "D:\\Downloads\\TikTok"
OUTPUT_FOLDER = "D:\\Downloads\\Edited"
ARCHIVE_FOLDER = "D:\\Downloads\\OriginalClips"

# 创建必要文件夹
os.makedirs(OUTPUT_FOLDER, exist_ok=True)
os.makedirs(ARCHIVE_FOLDER, exist_ok=True)

def wait_for_file_completion(file_path, check_interval=1, timeout=30):
    """等待文件写入完成,通过文件大小是否稳定判断"""
    prev_size = -1
    elapsed = 0
    while elapsed < timeout:
        current_size = os.path.getsize(file_path)
        if current_size == prev_size:
            return True
        prev_size = current_size
        time.sleep(check_interval)
        elapsed += check_interval
    return False

def process_tiktok_video(input_video):
    output_video = os.path.join(OUTPUT_FOLDER, os.path.basename(input_video))
    
    # 1. 处理背景流:拉伸至1080x1920 + 高斯模糊
    background = (
        ffmpeg
        .input(input_video)
        .filter('scale', width=1080, height=1920)
        .filter('gblur', sigma=10)  # 使用gblur实现更柔和的模糊效果
    )
    
    # 2. 处理前景流:保持原比例缩放,不超过画布尺寸,居中放置
    foreground = (
        ffmpeg
        .input(input_video)
        .filter('scale', width=1080, height=1920, force_original_aspect_ratio='decrease')
        .filter('pad', width=1080, height=1920, x='(ow-iw)/2', y='(oh-ih)/2')
    )
    
    # 3. 叠加前景到背景上,输出视频
    (
        ffmpeg
        .overlay(background, foreground)
        .output(output_video, vcodec='libx264', acodec='aac')
        .run(quiet=False, overwrite_output=True)
    )
    
    # 4. 移动原文件到存档文件夹
    shutil.move(input_video, os.path.join(ARCHIVE_FOLDER, os.path.basename(input_video)))

class MP4Handler(FileSystemEventHandler):
    def on_created(self, event):
        if not event.is_directory and event.src_path.endswith('.mp4'):
            # 等待文件写入完成
            if wait_for_file_completion(event.src_path):
                process_tiktok_video(event.src_path)

if __name__ == "__main__":
    handler = MP4Handler()
    observer = Observer()
    observer.schedule(handler, MONITOR_PATH, recursive=False)
    observer.start()
    
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

代码说明

  • 文件完整性检查:wait_for_file_completion函数通过检测文件大小是否稳定,确保文件完全写入后再处理,解决了之前无反应的问题。
  • 视频流处理:分别创建背景和前景两个流,背景流拉伸后模糊,前景流按比例缩放并居中,再通过overlay叠加,符合TikTok格式需求。
  • 路径配置:统一使用大写常量管理路径,自动创建所需文件夹,避免路径不存在的错误。
  • FFmpeg参数优化:指定vcodec='libx264'和acodec='aac'保证输出视频的兼容性,overwrite_output=True允许覆盖同名文件。

内容的提问来源于stack exchange,提问作者p00pyday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:31:01