人工智能基础-视频处理
一、介绍
随着自媒体时代,现在对视频的处理变得越来越常见,使用的一些专业工具如PR,但是效率不高;如果只是对视频进行一些简单的处理的话,或者视频的数量非常多的话,那么使用专业软件显然就不太适合了。
而python中有专门用于处理视频处理库,以非常方便地对视频进行一些简单处理,下面我们就来看一看
二、案例
1.获取及修改视频MD5值
# !/usr/bin/env python # encoding: utf-8 import hashlib """ 备注:像快影、剪映这些软件都不能对视频MD5值修改,而MD5也是判断视频是否重复的重要标准 """ def get_file_md5(file_path): """分段读取,获取文件的md5值""" with open(file_path, 'rb') as file: md5_obj = hashlib.md5() while True: buffer = file.read(8096) if not buffer: break md5_obj.update(buffer) hash_code = md5_obj.hexdigest() md5 = str(hash_code).lower() return md5 def modify_file_md5(file_path): """ 修改文件的md5值 :param file_path: """ with open(file_path, 'a') as file: file.write("####&&&&") if __name__ == '__main__': print(get_file_md5(r'C:/Users/Administrator/Desktop/test001.mp4')) # 获取修改前MD5 modify_file_md5(r'C:/Users/Administrator/Desktop/test001.mp4') # 修改视频MD5 print(get_file_md5(r'C:/Users/Administrator/Desktop/test001.mp4')) # 获取修改后的MD5
2.增加画面亮度
#!/usr/bin/env python # encoding: utf-8 """ 首先,安装 moviepy 依赖库 # 安装依赖库 pip3 install moviepy """ from moviepy.editor import VideoFileClip def handle_frame(image_frame): """ 处理图片帧 :param image_frame:图片帧 :return: """ image_frame_result = image_frame * 1.2 # 如果颜色值超过255,直接设置为255 image_frame_result[image_frame_result > 255] = 255 return image_frame_result def increase_video_brightness(file_path): """ 增加视频整体亮度 :param file_path:源视频路径 :return: """ video = VideoFileClip(file_path) result = video.fl_image(handle_frame) file_path_new = "/Users/xingag/Desktop/new.mp4" result.write_videofile(file_path_new)
3.获取视频时长
from moviepy.video.io.VideoFileClip import VideoFileClip # 视频文件路径 video_path = r"C:\Users\sunteng\Desktop\test300\test2.mp4" # 获取视频时长 clip = VideoFileClip(video_path) duration = clip.duration print("视频时长:{}秒".format(duration)) # 关闭视频文件 clip.reader.close() clip.audio.reader.close_proc()
4.批量生成视频
#!/usr/bin/python # -*- coding: UTF-8 -*- ###_________________________读取一个视频,批量生成视频___________________________________________ import cv2 # 打开原始视频文件 cap = cv2.VideoCapture(r'C:\Users\sunteng\Desktop\test300\test2.mp4') # 获取视频的总帧数和帧率 total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) print("视频总帧数:{}".format(total_frames)) fps = cap.get(cv2.CAP_PROP_FPS) # 计算每个视频片段的帧数 frames_per_segment = int(total_frames / 100) print("分割后每个视频帧数:",frames_per_segment) # 循环处理每个视频片段 for i in range(100): # 计算当前片段的起始和结束帧数 start_frame = i * frames_per_segment end_frame = (i + 1) * frames_per_segment # 重置视频帧的位置 cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame) # 创建新的视频文件 out = cv2.VideoWriter(fr'C:\Users\sunteng\Desktop\test300\new_300\output_{i}.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))) # 循环提取当前片段的每一帧 for j in range(start_frame, end_frame): ret, frame = cap.read() if ret: out.write(frame) else: break # 关闭新的视频文件 out.release() print("上传成功关闭文件!") # 关闭原始视频文件 cap.release()
5.视频修改
###____________________________修改视频分辨率_________________________________________ import cv2 # 打开视频文件 cap = cv2.VideoCapture(r'C:\Users\sunteng\Desktop\test300\test2.mp4') # 获取视频帧率和分辨率 fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 设置新的分辨率 new_width = 640 new_height = 480 # 创建输出视频文件 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('output.mp4', fourcc, fps, (new_width, new_height)) while cap.isOpened(): # 读取视频帧 ret, frame = cap.read() if not ret: break # 修改分辨率 frame = cv2.resize(frame, (new_width, new_height)) # 写入输出视频文件 out.write(frame) ##显示视频帧 # cv2.imshow('frame', frame) # if cv2.waitKey(1) & 0xFF == ord('q'): # break # 释放资源 cap.release() out.release() cv2.destroyAllWindows() ###____________________________修改视频尺寸________________________________________ import cv2 # 打开视频文件 cap = cv2.VideoCapture('video.mp4') # 获取视频帧率 fps = cap.get(cv2.CAP_PROP_FPS) # 定义输出视频的尺寸 width = 640 height = 480 # 创建VideoWriter对象,用于保存输出视频 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height)) # 逐帧读取视频并调整大小 while True: ret, frame = cap.read() if not ret: break resized_frame = cv2.resize(frame, (width, height)) out.write(resized_frame) # 释放资源 cap.release() out.release() cv2.destroyAllWindows() #______________________________视频旋转90度___________________________________________ import cv2 # 打开视频文件 cap = cv2.VideoCapture(r'C:\Users\sunteng\Desktop\test300\test2.mp4') # 获取视频帧率和尺寸 fps = int(cap.get(cv2.CAP_PROP_FPS)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 创建视频编码器 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('output.mp4', fourcc, fps, (height, width)) # 读取视频帧并旋转 while(cap.isOpened()): ret, frame = cap.read() if ret == True: frame = cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE) out.write(frame) else: break # 关闭视频文件和编码器 cap.release() out.release() ###____________________________________把视频添加文字后保存_________________________________________ import cv2 import subprocess # 打开视频文件 cap = cv2.VideoCapture('output.mp4') # 创建视频编解码器 fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 获取视频的宽度和高度 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 创建一个视频输出对象 out = cv2.VideoWriter('output123.mp4', fourcc, 30, (width, height)) # 循环遍历每一帧 while cap.isOpened(): ret, frame = cap.read() if ret: # 在每一帧上添加文字 cv2.putText(frame, 'Hello, World!', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 写入输出视频 out.write(frame) ###显示当前帧(显示当前视频) # cv2.imshow('frame', frame) # # 按q键退出循环(监听键盘) # if cv2.waitKey(25) & 0xFF == ord('q'): # break else: break # 释放资源 cap.release() out.release() cv2.destroyAllWindows() ###使用FFmpeg库将视频转换为指定格式(可以不使用) # subprocess.call(['ffmpeg', '-i', 'output.mp4', '-vcodec', 'copy', '-acodec', 'copy', 'output.avi'])
6.多个视频合成一个 &修改视频宽*高
#!/usr/bin/python # -*- coding: UTF-8 -*- ###__________________________________改变视频分辨率________________________________________ import cv2 videoCapture = cv2.VideoCapture(r'C:\Users\sunteng\Desktop\test300\大文件视频\final_video.mp4') fps = 25 # 保存视频的帧率 size = (3800, 1800) # 保存视频的大小 videoWriter = cv2.VideoWriter(r'C:\Users\sunteng\Desktop\test300\大文件视频\>1000的视频.mp4', cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), fps, size) i = 0 while True: success, frame = videoCapture.read() if success: i += 1 if (i >= 1 and i <= 8000): frame = cv2.resize(frame, (3500, 1800))#需要和size一致 videoWriter.write(frame) if (i > 8000): print("success resize") break else: print('end') break ###___________________________________把两个视频合成____________________________________________ ##需要安装moviepy库:pip install moviepy # from moviepy.editor import VideoFileClip, concatenate_videoclips # # video_1 = VideoFileClip(r"C:\Users\sunteng\Desktop\test300\大文件视频\373Mresizex1.mp4") # video_2 = VideoFileClip(r"C:\Users\sunteng\Desktop\test300\大文件视频\503Mresizex1.mp4") # #调用三方concatenate_videoclips函数完成视频合成 # final_video= concatenate_videoclips([video_1, video_2]) #也可以写多个如:[video_1, video_2,video_3] # #保存合成后的新视频 # final_video.write_videofile(r"C:\Users\sunteng\Desktop\test300\大文件视频\final_video.mp4")
7.ffmpeg的使用
ffmpeg是一个开源的跨平台音视频处理工具,它可以对音视频进行录制、转码、剪辑、合并、分离、提取等操作。ffmpeg支持多种音视频格式和编解码器,可以在命令行或者GUI界面下使用。它被广泛应用于视频处理、音视频编解码、流媒体等领域。
如果没有安装需要安装:安装ffmpeg教程链接 ,,ffmpeg安装包链接
进入 cmd,输入 ffmpeg -version,可验证当前系统是否识别 ffmpeg,以及查看 ffmpeg 的版本:
##########################视频转码############################### ###转码为 H.264 ffmpeg -i input.mp4 -c:v libx264 output.mp4 #转码为 H.265 ffmpeg -i input.mp4 -c:v libx265 output.mp4 #转码为 AV1 ffmpeg -i input.mp4 -c:v libaom-av1 output.mkv ##########################视频中提取音频############################### ###从视频中提取音频流 ffmpeg -i video.mp4 -vn -acodec copy audio.aac ###视频提取音频并转码 ffmpeg -i video.mp4 -q:a 0 audio.mp3 ###指定音频编码器提取 ffmpeg -i video.mp4 -vn -acodec libmp3lame audio.mp3 ###提取音频流到其他格式(-ar 44100 设置音频采样率为 44.1 kHz,,, -ac 2 设置音频声道为立体声(双声道),,, -acodec pcm_s16le 指定音频编码为 WAV 格式) ffmpeg -i video.mp4 -vn -acodec pcm_s16le -ar 44100 -ac 2 audio.wav ##########################剪辑视频############################### ###基础剪辑 -ss 指定开始时间,-t 指定持续时间 ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 -c copy output.mp4 ###先解码再裁剪(解决前xx秒白屏问题) ffmpeg -ss 00:00:03 -i input.mp4 -t 00:00:10 -c copy output.mp4 ###重新编码视频(解决白屏和进度条问题) ffmpeg -ss 00:00:03 -i input.mp4 -t 00:00:10 -c:v libx264 -c:a aac output.mp4 ##########################截图操作############################### #从视频中提取某一帧作为图片(-vframes 指定提取的帧数) ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 screenshot.jpg ##########################合并视频############################### ffmpeg -i "concat:clip1.mp4|clip2.mp4" -c copy output.mp4 ##########################添加水印############################### #添加图片水印(使用 overlay 滤镜) ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4 #添加文字水印 ffmpeg -i 7528988997319871803.mp4 -vf "drawtext=fontfile=C:\\Windows\\Fonts\\simhei.ttf:text='test001':x=(w-tw)/2:y=(h-th)/2:fontsize=24:fontcolor=red" -c:a copy output.mp4 ###调整视频亮度,,eq:使用 eq 滤镜调整视频的亮度和对比度,,contrast:调整对比度,,brightness:调整亮度 ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" -c:a copy output.mp4 ###视频的亮度降低 10%,对比度降低 20%: ffmpeg -i input.mp4 -vf "eq=brightness=-0.1:contrast=0.8" -c:a copy output.mp4 ##########################其他命令############################### ###查看音频或视频文件的详细信息 ffmpeg -i input.mp4 ###尝试修复损坏的音频或视频文件 ffmpeg -i input.mp4 -c copy -map 0 output_fixed.mp4 ##########################音频处理############################### ###调整音频比特率 ffmpeg -i input.mp3 -b:a 128k output.mp3 ###音频剪辑(-ss 指定开始时间,-t 指定持续时间) ffmpeg -i input.mp3 -ss 00:00:10 -t 00:00:20 -c copy output.mp3 ###将多个音频文件合并 ffmpeg -i "concat:audio1.mp3|audio2.mp3" -c copy output.mp3 ###调整音频音量 ffmpeg -i input.mp3 -af "volume=0.5" output.mp3 #######################ffmpeg常用命令(在cmd运行)######################### #修改分辨率 ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4 -hide_banner #更改视频宽高比 ffmpeg -i video_1920.mp4 -vf scale=640:480,setdar=4:3 video_640x480.mp4 -hide_banner #视频添加水印 ffmpeg -i in.mp4 -i xxx.png -filter_complex "overlay=5:5" out.mp4 #把多个视频合成一个 ffmpeg -i "concat:input1.mp4|input2.mp4|input3.mp4" -c copy new_output.mp4
8.剪切指定时长视频
#!/usr/bin/python # -*- coding: UTF-8 -*- from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip from moviepy.video.io.VideoFileClip import VideoFileClip import time def get_video_time(video_path): '''获取视频时长''' clip = VideoFileClip(video_path) duration = clip.duration print("视频时长:{}秒".format(duration)) # 关闭视频文件 clip.reader.close() clip.audio.reader.close_proc() # 返回视频时间长 return duration def put_video_time(required_video_file, endtime, starttime=0): '''剪切视频-保留指定时长 required_video_file:视频路径 endtime:指定视频时长(结束时间) starttime:开始时间,默认为0 ''' video_time = get_video_time(required_video_file) print("视频时长为:{}".format(video_time)) _time = int(time.time()) # required_video_file文件名, starttime从几秒开始, endtime到什么什么结束, targetname生成视频名字 ffmpeg_extract_subclip(required_video_file, starttime, endtime, targetname=str(_time) + ".mp4") return str(_time) + ".mp4" if __name__ == '__main__': mp4_name=put_video_time("5.3M-2222.mp4",20)#指定时间剪切 print("生成的MP4文件:",mp4_name)
9.亮度调整&加水印&画中画&音量&速度控制等
##会覆盖-不推荐
#!/usr/bin/env python # -*- coding: utf-8 -*- ###############################################每处理一次视频都会被覆盖########################################### import hashlib from moviepy.editor import VideoFileClip, vfx,TextClip, CompositeVideoClip from moviepy.config import change_settings ###手动指定ImageMagick的路径(需要手动安装:http://www.imagemagick.com.cn/download.html),添加水印的依赖插件 change_settings({"IMAGEMAGICK_BINARY": r"D:\Program Files (x86)\ImageMagick-6.2.7-Q16\convert.exe"}) class VideoProcessor: def __init__(self, file_path): """ 初始化 VideoProcessor 类 :param file_path: 视频文件路径 """ self.file_path = file_path def get_file_md5(self): """ 分段读取,获取文件的 MD5 值 :return: 文件的 MD5 值 """ with open(self.file_path, 'rb') as file: md5_obj = hashlib.md5() while True: buffer = file.read(8096) if not buffer: break md5_obj.update(buffer) hash_code = md5_obj.hexdigest() md5 = str(hash_code).lower() return md5 def modify_file_md5(self): """ 修改文件的 MD5 值 """ with open(self.file_path, 'a') as file: file.write("####&&&&") def handle_frame(self, image_frame): """ 处理图片帧 :param image_frame: 图片帧 :return: 处理后的图片帧 """ image_frame_result = image_frame * 1.2 # 如果颜色值超过 255,直接设置为 255 image_frame_result[image_frame_result > 255] = 255 return image_frame_result def increase_video_brightness(self, output_path): """ 增加视频整体亮度 :param output_path: 输出视频路径 """ video = VideoFileClip(self.file_path) result = video.fl_image(self.handle_frame) result.write_videofile(output_path) def increase_video_brightness2(self, output_path, coefficient_value=1.3): """ 增加视频整体亮度2 :param output_path: 输出视频路径 :param coefficient_value: 调整系数值 """ video = VideoFileClip(self.file_path) video.fx(vfx.colorx, coefficient_value).write_videofile(output_path) def add_watermark_to_video(self, output_path, watermark_text, position=("center", "center"), fontsize=18,color='grey', angle=25,opacity=0.3,font_path=None): """ 为视频添加倾斜且带有透明度的水印 :param input_path: 输入视频路径(通过类属性获取) :param output_path: 输出视频路径 :param watermark_text: 水印文本 :param position: 水印位置,例如 ("center", "center") 或 (x, y) :param fontsize: 字体大小 :param color: 字体颜色 :param angle: 水印的倾斜角度 :param opacity: 水印的透明度(0.0 完全透明,1.0 完全不透明) :param font_path: 支持中文的字体文件路径 """ # 加载视频 video = VideoFileClip(self.file_path) # 指定支持中文的字体文件路径 if font_path is None: font_path = r"C:\Windows\Fonts\simhei.ttf" # Windows 系统默认的宋体字体路径 # 创建水印文本 watermark = TextClip(txt=watermark_text, fontsize=fontsize, color=color, font=font_path) # 设置水印的倾斜角度 watermark = watermark.rotate(angle, expand=True) # 设置水印的透明度 watermark = watermark.set_opacity(opacity) # 设置水印位置 watermark = watermark.set_position(position) # 设置水印持续时间与视频一致 watermark = watermark.set_duration(video.duration) # 将水印添加到视频 final_video = CompositeVideoClip([video, watermark]) # 保存输出视频 final_video.write_videofile(output_path, codec="libx264", fps=video.fps) # 示例用法 if __name__ == "__main__": video_path = r"C:\Users\PC\PycharmProjects\pythonProject\original_files\7528988997319871803.mp4" output_path = r"C:\Users\PC\PycharmProjects\pythonProject\original_files\7528988997319871803new.mp4" #实例化对象 processor = VideoProcessor(video_path) ###获取文件的 MD5 值 md5_value = processor.get_file_md5() print(f"文件的 MD5 值: {md5_value}") ###修改文件的 MD5 值 processor.modify_file_md5() print("修改MD5值成功") ###增加视频整体亮度-方式1 # processor.increase_video_brightness(output_path) # print("视频亮度调整成功") ###增加视频整体亮度-方式2 processor.increase_video_brightness2(output_path, coefficient_value=1.5) print("视频亮度调整成功2") ###视频添加水印 processor.add_watermark_to_video(output_path,watermark_text="土豆麻麻") print("水印添加成功!")
##不覆盖-最后保存视频
#!/usr/bin/env python # -*- coding: utf-8 -*- from moviepy.editor import VideoFileClip, vfx, TextClip, CompositeVideoClip, ImageClip from moviepy.config import change_settings # 手动指定 ImageMagick 的路径 change_settings({"IMAGEMAGICK_BINARY": r"D:\Program Files (x86)\ImageMagick-6.2.7-Q16\convert.exe"}) class VideoProcessor: def __init__(self, file_path): """ 初始化 VideoProcessor 类 :param file_path: 视频文件路径 """ self.file_path = file_path self.video = VideoFileClip(self.file_path) self.processed_video = None # 用于存储处理后的视频对象(和self.vide一样的) def get_video_time(self): '''获取视频时长''' duration = self.video.duration print("视频时长:{}秒".format(duration)) return duration def put_video_time(self, video_time,endtime,intercept_video_time=15,starttime=0): ''' 剪切视频-保留指定时长 :param endtime: 指定视频时长(结束时间) :intercept_video_time: 指定时间判断是否需要截取 :param starttime: 开始时间,默认为0 ''' if video_time > int(intercept_video_time): #使用 subclip 方法截取视频片段,并存储在内存中 self.processed_video = self.video.subclip(starttime, endtime) print("视频剪切成功,处理后的视频已存储在内存中。") else: print("视频时长不足15秒,未进行剪切。") def increase_video_brightness2(self, coefficient_value=1.3): """ 增加视频整体亮度2 :param coefficient_value: 调整系数值 """ # 若processed_video有值-调整亮度后,赋值给 self.processed_video(将对象存到内存中) if self.processed_video: self.processed_video = self.processed_video.fx(vfx.colorx, coefficient_value) ###直接保存到本地 # video = VideoFileClip(self.file_path) # video.fx(vfx.colorx, coefficient_value).write_videofile(r"C:\Users\PC\PycharmProjects\pythonProject\original_files\123456.mp4") else: ######视频时长不满足xx秒 self.video = self.video.fx(vfx.colorx, coefficient_value) ###直接保存到本地 # video = VideoFileClip(self.file_path) # video.fx(vfx.colorx, coefficient_value).write_videofile(r"C:\Users\PC\PycharmProjects\pythonProject\original_files\123456.mp4") def adjust_volume(self, volume_factor): """ 调整视频的音量 :param volume_factor: 音量调整因子(例如 0.5 表示降低到 50% ,, 2.0 表示提高到 200%) """ video_to_use = self.processed_video if self.processed_video else self.video # 调整音量 video_to_use = video_to_use.volumex(volume_factor) # 保存调整后的视频到类的属性中 self.processed_video = video_to_use def playback_speed(self, speed): """ 调整视频的播放速度 :param speed: 速度调整因子(例如 0.5 表示降低到 50% ,, 2.0 表示提高到 200%) """ video_to_use = self.processed_video if self.processed_video else self.video # 调整速度 speedup_clip = video_to_use.speedx(speed) # 速度播放 # 保存调整后的视频到类的属性中 self.processed_video = speedup_clip def add_watermark_to_video(self, output_path, watermark_text, position=("center", "center"), fontsize=18, color='grey', angle=25, opacity=0.3, font_path=None): """ 为视频添加倾斜且带有透明度的水印 :param output_path: 输出视频路径 :param watermark_text: 水印文本 :param position: 水印位置,例如 ("center", "center") 或 (x, y) :param fontsize: 字体大小 :param color: 字体颜色 :param angle: 水印的倾斜角度 :param opacity: 水印的透明度(0.0 完全透明,1.0 完全不透明) :param font_path: 支持中文的字体文件路径 """ # 指定支持中文的字体文件路径 if font_path is None: font_path = r"C:\Windows\Fonts\simhei.ttf" # Windows 系统默认的黑体字体路径 # 创建水印文本 watermark = TextClip(txt=watermark_text, fontsize=fontsize, color=color, font=font_path) # 设置水印的倾斜角度 watermark = watermark.rotate(angle, expand=True) # 设置水印的透明度 watermark = watermark.set_opacity(opacity) # 设置水印位置 watermark = watermark.set_position(position) # 设置水印持续时间与视频一致 video_to_use = self.processed_video if self.processed_video else self.video watermark = watermark.set_duration(video_to_use.duration) # 将水印添加到视频 final_video = CompositeVideoClip([video_to_use, watermark]) ###保存合成后的视频到类的属性中(保存到内存) self.processed_video = final_video # ###保存输出视频(直接保存到磁盘了) # final_video.write_videofile(output_path, codec="libx264", fps=video_to_use.fps) def add_picture_in_picture(self, output_path, pip_images, positions, opacities, durations): """ 为视频添加多个画中画图片,并控制透明度 :param output_path: 输出视频路径 :param pip_images: 画中画图片路径列表 :param positions: 画中画图片的位置列表,例如 [(100, 100), (500, 500), (300, 300)] :param opacities: 画中画图片的透明度列表,例如 [0.5, 0.3, 0.7] :param durations: 画中画图片的持续时间列表,例如 [10, 15, 20],,这个时间最好不要超过视频时长、否则有黑屏 """ # 创建主视频的副本 video_to_use = self.processed_video if self.processed_video else self.video print("video_to_use=",video_to_use.duration) final_video = video_to_use # 遍历画中画图片列表,添加到主视频中 for pip_image_path, position, opacity, duration in zip(pip_images, positions, opacities, durations): # 加载画中画图片 pip_image = ImageClip(pip_image_path) # 设置透明度 pip_image = pip_image.set_opacity(opacity) # 设置位置 pip_image = pip_image.set_position(position) # 设置持续时间 pip_image = pip_image.set_duration(duration) # 将画中画图片添加到主视频中 final_video = CompositeVideoClip([final_video, pip_image]) # 保存输出视频(verbose=False:禁用详细的日志输出,,logger=None:禁用进度条和其他日志信息) final_video.write_videofile(output_path, codec="libx264", fps=video_to_use.fps,verbose=False, logger=None)) # 示例用法 if __name__ == "__main__": video_path = r"C:\Users\PC\PycharmProjects\pythonProject\original_files\7528988997319871803.mp4" final_output_path = r"C:\Users\PC\PycharmProjects\pythonProject\original_files\7528988997319871803_new.mp4" ###实例化对象 processor = VideoProcessor(video_path) ###获取视频时长 video_time = processor.get_video_time() ###剪切视频 processor.put_video_time(video_time, endtime=16, intercept_video_time=15, starttime=0) print(">>>>>>视频长度处理成功!>>>>>>") ###增加视频整体亮度 processor.increase_video_brightness2(coefficient_value=0.7) print(">>>>>>视频亮度调整成功2>>>>>>") ###调整音量 processor.adjust_volume(1.3) print(">>>>>>音量调整成功>>>>>>>>") ###调整视频播放速度 processor.playback_speed(1.5) print(">>>>>>视频播放速度调整成功>>>>>>>>") ###添加水印 processor.add_watermark_to_video(final_output_path, watermark_text="土豆麻麻") print(">>>>>>水印添加成功!>>>>>>>>") ###添加画中画 pip_images = [r"C:\Users\PC\Downloads\123.png", r"C:\Users\PC\Downloads\234.png", r"C:\Users\PC\Downloads\345.png"] processor.add_picture_in_picture(final_output_path, pip_images, positions=[(100, 100), (500, 500), (300, 300)], opacities=[0.0, 0.0, 0.0], durations=[10, 12,15]) print(">>>>>>>画中画图片添加成功!>>>>>>")
10.调整视频的分辨率、帧率、亮度、饱和度,并应用滤镜
#!/usr/bin/env python # -*- coding: utf-8 -*- from moviepy.editor import VideoFileClip from PIL import Image, ImageEnhance, ImageFilter import numpy as np def process_video(input_path, output_path, new_resolution=(1280, 720), new_fps=30, brightness=1.0, saturation=1.0, filter_type=None): """ 处理视频:调整分辨率、帧率、亮度、饱和度,并应用滤镜 :param input_path: 输入视频的路径 :param output_path: 输出视频的路径 :param new_resolution: 新的分辨率,默认为 (1280, 720) :param new_fps: 新的帧率,默认为 30fps :param brightness: 亮度调整,默认为 1.0(不调整) :param saturation: 饱和度调整,默认为 1.0(不调整) :param filter_type: 滤镜类型,默认为 None(不应用滤镜) ,,常用滤镜BLUR、CONTOUR、DETAIL、EDGE_ENHANCE_MORE等 """ # 读取视频文件 video = VideoFileClip(input_path) # 调整分辨率 video_resized = video.resize(newsize=new_resolution) # 调整帧率 video_resized = video_resized.set_fps(new_fps) # 定义处理每一帧的函数 def process_frame(frame): # 将帧转换为Pillow图像 image = Image.fromarray(frame) # 调整亮度 if brightness != 1.0: enhancer = ImageEnhance.Brightness(image) image = enhancer.enhance(brightness) # 调整饱和度 if saturation != 1.0: enhancer = ImageEnhance.Color(image) image = enhancer.enhance(saturation) # 应用滤镜 if filter_type == "blur": image = image.filter(ImageFilter.GaussianBlur(radius=5)) elif filter_type == "contour": image = image.filter(ImageFilter.CONTOUR) elif filter_type == "edge_enhance": image = image.filter(ImageFilter.EDGE_ENHANCE) # 将Pillow图像转换回numpy数组 return np.array(image) # 应用处理函数到每一帧 video_processed = video_resized.fl_image(process_frame) # 输出视频 video_processed.write_videofile(output_path, codec="libx264", audio_codec="aac") # 关闭视频文件 video.close() video_resized.close() video_processed.close() # 使用示例 input_video_path = r"./original_files/123456.mp4" output_video_path = r"./original_files/1234562222222.mp4" process_video(input_video_path, output_video_path, brightness=1.2, saturation=1.3, filter_type="blur")
相关链接:
https://www.jianshu.com/p/98a0c091c4bf ...........................................................................多个视频合成
https://blog.51cto.com/qchenz/5073120#1__ffmpeg_6 .....................................................第三方FFmpeg处理视频,,ffmeg处理
浙公网安备 33010602011771号