
音视频处理是大家日常离不开的操作,一般大家有好几种解决方案
这时候,AI 就能来大显身手了,所以简而言之,就是把 AI 和 FFmpeg 命令结合起来使用,起到我下命令它执行的奇妙效果,可能比自己用图形化界面还爽,因为使用界面即使你是 VIP ,你还要找到这个功能在哪里
FFmpeg 这个当然少不了,推荐大家去官网下载:Download FFmpeg
不过大家不要慌着去下载,可以在你本机搜索一下,十之八九你机器上已经有了
看下图,我说的没错吧

第二步当然是把 ffmpeg 加入 path ,这个对于码农来说很简单了,如果你不会,可以问问 AI
这里我把终端和 AI 整合在一起,方便大家操作,来看看几个常见的操作
随着 AI 技术的发展,要理解一个视频的内容,一个捷径是进行语音识别,这个时候我们就需要将音视频进行分离,来看看这个怎么来实现,有了 AI ,我们就不用去查询命令和帮助了
我们只需要下指令:将 C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 的音频分离出来

这种下命令的感觉是不是很爽,速度也很快,你打开一个视频剪辑工具的时间它早就处理完了
视频要转换成各种格式和分辨率,这可是很多工具的 VIP 功能,是要花小钱钱的,我们现在只要下命令就行了
我们只需要下指令:把 C:\Users\lgc653\Downloads\Wdo_xPLBS_TotQyQ.mp4 降低到 480p

这就搞定了
加水印是一个常见操作了,我们来看看 AI 做这个怎么样
我们只需要下指令:给 C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 加上右上方加上水印,文字是“FFmpeg”

看看效果,果然实现了
但是要添加中文水印,就比较纠结了,主要要和字体结合,AI 就容易犯错了

我们就不折腾 AI 添加中文水印了,再添加一个图片的水印看看效果,这个应该是比较主流的需求
给出指令给 C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 加上右上方加上图片水印,水印图片是 C:\Users\lgc653\Downloads\icon.png

水印太大了,喧宾夺主,直接指示他把尺寸换成 100*100

喜不喜欢这种指挥别人干活的感觉
ffmpeg 还能删除视频中重复的画面,你还不知道把,常见的收费工具也没提供这个功能,我们来做个实验看看
指使 AI 来做这个:把 C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 随机创建一些重复帧
AI 给出的指令如下,这个命令会在视频的末尾添加 5 秒的重复帧。
ffmpeg -i C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 -vf "tpad=stop_mode=clone:stop_duration=5" -c:a copy C:\Users\lgc653\Downloads\output.mp4 很快就完成了,生成了一个output.mp4文件,可以看到视频从 49 秒变成了 53 秒
下面开始删除重复帧了……怎么有点监守自盗的意思
指使 AI 来做这个:从 C:\Users\lgc653\Downloads\output.mp4 删除重复的画面
可以看到生成了 cleaned_output.mp4 ,视频又变回了 49 秒

当然你非要做个小应用,这个也是小 case ,以下程序完全使用自然语言指使由 AI 生成,本人未做任何修改

import tkinter as tk from tkinter import filedialog import subprocess def choose_video(): """打开文件选择对话框,选择 MP4 视频文件""" global video_path video_path = filedialog.askopenfilename( initialdir="/", title="选择视频文件", filetypes=(("MP4 files", "*.mp4"), ("all files", "*.*")), ) if video_path: video_label.config(text=video_path) def get_video_info(): """使用 FFprobe 获取视频信息""" if not video_path: return command = [ "ffprobe", "-v", "quiet", "-show_format", "-show_streams", video_path, ] output = subprocess.check_output(command).decode("utf-8") info_text.delete("1.0", tk.END) info_text.insert(tk.END, output) def convert_format(): """将视频转换为指定格式""" if not video_path: return new_format = format_entry.get() if not new_format: return output_path = video_path.replace(".mp4", f".{new_format.lower()}") command = [ "ffmpeg", "-i", video_path, "-c:v", "copy", "-c:a", "copy", output_path, ] subprocess.call(command) def trim_video(): """裁剪视频的指定时间段""" if not video_path: return start_time = start_entry.get() end_time = end_entry.get() if not start_time or not end_time: return output_path = video_path.replace(".mp4", "_trimmed.mp4") command = [ "ffmpeg", "-i", video_path, "-ss", start_time, "-to", end_time, "-c", "copy", output_path, ] subprocess.call(command) def add_watermark(): """为视频添加文字水印""" if not video_path: return text = watermark_entry.get() if not text: return output_path = video_path.replace(".mp4", "_watermarked.mp4") command = [ "ffmpeg", "-i", video_path, "-vf", f"drawtext=text='{text}':fOntcolor=white:fOntsize=24:box=1:[email protected]:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2", output_path, ] subprocess.call(command) # 创建主窗口 root = tk.Tk() root.title("视频处理工具") # 选择视频文件 video_label = tk.Label(root, text="请选择视频文件") video_label.pack() choose_button = tk.Button(root, text="选择文件", command=choose_video) choose_button.pack() # 显示视频信息 info_button = tk.Button(root, text="获取视频信息", command=get_video_info) info_button.pack() info_text = tk.Text(root) info_text.pack() # 转换格式 format_label = tk.Label(root, text="目标格式 (例如: avi, mov):") format_label.pack() format_entry = tk.Entry(root) format_entry.pack() convert_button = tk.Button(root, text="转换格式", command=convert_format) convert_button.pack() # 裁剪视频 start_label = tk.Label(root, text="开始时间 (HH:MM:SS):") start_label.pack() start_entry = tk.Entry(root) start_entry.pack() end_label = tk.Label(root, text="结束时间 (HH:MM:SS):") end_label.pack() end_entry = tk.Entry(root) end_entry.pack() trim_button = tk.Button(root, text="裁剪视频", command=trim_video) trim_button.pack() # 添加水印 watermark_label = tk.Label(root, text="水印文字:") watermark_label.pack() watermark_entry = tk.Entry(root) watermark_entry.pack() watermark_button = tk.Button(root, text="添加水印", command=add_watermark) watermark_button.pack() root.mainloop()