基于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
相关产品推荐
相关产品推荐

