人工智能基础-视频处理

一、介绍

随着自媒体时代,现在对视频的处理变得越来越常见,使用的一些专业工具如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("水印添加成功!")
View Code

 ##不覆盖-最后保存视频

#!/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(">>>>>>>画中画图片添加成功!>>>>>>")
View Code

 

 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")
View Code

 

 

 

 

 

相关链接:

https://www.jianshu.com/p/98a0c091c4bf ...........................................................................多个视频合成

https://blog.51cto.com/qchenz/5073120#1__ffmpeg_6 .....................................................第三方FFmpeg处理视频,,ffmeg处理

 

posted on 2022-07-26 10:01  chen_2987  阅读(718)  评论(0)    收藏  举报

导航