自然语言进行音视频处理

概述

音视频处理是大家日常离不开的操作,一般大家有好几种解决方案

  • 使用各种专业的剪辑工具 —— 这个有一定学习门槛,打开软件可能都需要几十秒
  • 使用各种音视频处理工具 —— 这个用一会儿他就要你充会员了
  • FFmpeg —— 上面这些工具底层都离不开 FFmpeg ,我们用 FFmpeg 更加直接快速,但是 FFmpeg 命令太难记

这时候,AI 就能来大显身手了,所以简而言之,就是把 AI 和 FFmpeg 命令结合起来使用,起到我下命令它执行的奇妙效果,可能比自己用图形化界面还爽,因为使用界面即使你是 VIP ,你还要找到这个功能在哪里

前期准备

FFmpeg 这个当然少不了,推荐大家去官网下载:Download FFmpeg

不过大家不要慌着去下载,可以在你本机搜索一下,十之八九你机器上已经有了

看下图,我说的没错吧

image-20241203111517171

第二步当然是把 ffmpeg 加入 path ,这个对于码农来说很简单了,如果你不会,可以问问 AI

开始实践

这里我把终端和 AI 整合在一起,方便大家操作,来看看几个常见的操作

分离音视频

随着 AI 技术的发展,要理解一个视频的内容,一个捷径是进行语音识别,这个时候我们就需要将音视频进行分离,来看看这个怎么来实现,有了 AI ,我们就不用去查询命令和帮助了

我们只需要下指令:将 C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 的音频分离出来

image-20241203112413915

这种下命令的感觉是不是很爽,速度也很快,你打开一个视频剪辑工具的时间它早就处理完了

视频转换压缩

视频要转换成各种格式和分辨率,这可是很多工具的 VIP 功能,是要花小钱钱的,我们现在只要下命令就行了

我们只需要下指令:把 C:\Users\lgc653\Downloads\Wdo_xPLBS_TotQyQ.mp4 降低到 480p

image-20241203112746768

这就搞定了

加水印

加水印是一个常见操作了,我们来看看 AI 做这个怎么样

我们只需要下指令:给 C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 加上右上方加上水印,文字是“FFmpeg”

image-20241203113626816

看看效果,果然实现了

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

image-20241203113640849

我们就不折腾 AI 添加中文水印了,再添加一个图片的水印看看效果,这个应该是比较主流的需求

给出指令给 C:\Users\lgc653\Downloads\HarvardXSOC1.longx-V004200.mp4 加上右上方加上图片水印,水印图片是 C:\Users\lgc653\Downloads\icon.png

image-20241203115109883

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

image-20241203115317297

😄喜不喜欢这种指挥别人干活的感觉

疑难问题

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 秒

image-20241203121358746

AI 编码

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

image-20241203122802962

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()

总结

  • 使用自然语言进行音视频处理非常靠谱
  • 只要 ffmpeg 能做到,你就能做到,再也不用等待打开大型软件,再也不用充 VIP 了

相关软件