1.环境需要
-
系统 windows10
-
ffmpeg,ffprobe
-
字体文件
-
python3以上版本
2.环境配置
从官网上下载ffmpeg版本https://github.com/BtbN/FFmpeg-Builds/releases,这里我用的是这个,解压之后里面包含ffmpeg,ffprobe,ffplay
然后将这个参数配置到环境变量中,如下图所示,在环境变量的path增加一项,值为上面ffmpeg解压的文件夹路径(注意指定到bin目录下)
cmd一下查看ffmpeg -v出现下面代表好了
查看一下电脑是否支持gpu,显示cuda代表硬件支持GPU的(其他牌子的gpu可以对应找一下),这边我的电脑是n卡,所以我这边就去下载GPU对应n卡的驱动
ffmpeg -hwaccels
-
安装 NVIDIA 驱动程序:确保您的系统安装了适用于您的 GPU 的 NVIDIA 驱动程序。你可以在这里下载驱动drivers download,或者在Geforce Experience软件下载(电脑上有这个的就可以省略)
-
下载并安装 CUDA Toolkit:从 NVIDIA 官方网站下载适用于您操作系统的 CUDA Toolkit,并按照说明进行安装。cuda download根据你的操作系统来选择你需要的安装包,你可以选择在线安装和离线安装,离线安装的安装包相对大一点,但是安装速度更快
3.傻瓜式安装,直接我同意下一步下一步
到这我们依赖的设计ffmpeg和GPU加速的环境就配置好了,如果没有GPU加速也不要紧,只需要把处理视频的参数修改为cpu支持的参数就行,不过速度会慢很多
3.代码部分
# -*- coding: utf-8 -*-import os
import subprocessimport ffmpeg
def gpu_cover_1080(sourceMp4Path,tarMp4Path):"""sourceMp4Path:源文件tarMp4Path:生成之后的目标文件"""probe = ffmpeg.probe(sourceMp4Path)width = probe['streams'][0]['width']height = probe['streams'][0]['height']text1 = "水印1".encode('utf-8').decode('utf-8')text2 = "水印2".encode('utf-8').decode('utf-8')# 字体样式文件 格式必须是 盘符\\:路径,不然的话生成视频乱码font_file='E\\:/simsun.ttc'ffmpeg_command = ['ffmpeg','-i', sourceMp4Path,'-vf', f"pad={width}:{height+120}:(ow-iw)/2:0:black,setsar=sar=1/1,drawtext=text='{text1}':fontfile='E\\:/simsun.ttc':y=h-line_h-60:x=(w-text_w)/2:fontsize=48:fontcolor=white:shadowy=2,drawtext=text='{text2}':fontfile='E\\:/simsun.ttc':y=h-line_h-10:x=(w-text_w)/2:fontsize=48:fontcolor=white:shadowy=2",'-c:v','h264_nvenc','-y',tarMp4Path]# 命令解读# -vf pad={width}:{height+120}:(ow-iw)/2:0:black,setsar=sar=1/1 画一个黑色(black)背景,宽为width高为height+120 然后将视频放置在(ow-iw)/2:0位置上 setsar=sar=1/1设置色块为1:1# -c:v h264_nvenc为gpu加速渲染的格式,cpu可以用这个libx264subprocess.run(ffmpeg_command)print(tarMp4Path)return tarMp4Pathdef task_dir_run(video_list_dir):"""短视频集合文件夹:param video_list_dir::return:"""mv_dir = os.path.join(video_list_dir,"out")if not os.path.exists(mv_dir):os.makedirs(mv_dir)# video_list=os.listdir(video_list_dir)video_files = sorted([f for f in os.listdir(video_list_dir) if f.endswith('.mp4')],key=lambda x: int(''.join(filter(str.isdigit, x))))for file in video_files:gpu_cover_1080(os.path.join(video_list_dir,file),os.path.join( mv_dir,file))video_dir = os.getcwd()
# video_dir="E:\\BaiduNetdiskDownload\\autosend\\"
print(f"当前处理路径为{video_dir}")
task_dir_run(video_dir)
print("处理完成")
这样就可以mp4文件上面加水印效果是这样的