python+moviepy音视频处理(一):基本操作

news2024/12/23 11:47:03

目录

视频处理

视频加载和输出

视频转换gif

视频裁剪

视频音量调节

去掉视频声音

视频中的音频提取与替换

获取视频属性

倍数播放视频

截取视频某帧为封面

多视频拼接

音频处理

替换视频文件的音频

多个音频文件拼接


安装:pip install moviepy

中文官网:moviepy-cn 文档

'''

moviepy.editor模块类

  • VideoFileClip:最常用的视频剪辑类, 用于导入视频文件(mp4、avi等格式皆可)
  • ImageClip:常用的剪辑类, 用于导入图片文件(png、jpg等格式皆可)
  • ColorClip:ImageClip的子类,比较少用, 可以把它当作是单一颜色的图片
  • TextClip:常用的剪辑类, 文字剪辑, 常用于给视频加字幕、水印、标题等
  • CompositeVideoClip:最常用剪辑类, 组合剪辑, 用于组合以上各种视频剪辑类CompositeVideoClip().to_videofile('file_name')
  • AudioClip:最常用音频剪辑类, 与VideoFileClip类似, 用于导入音频文件(mp3, m4a等)
  • CompositeAudioClip:与CompositeVideoClip类似, 是最常用的音频组合剪辑类

'''

视频处理

视频加载和输出

1、视频加载:调用`VideoFileClip(文件名)`即可将视频加载进来,可以支持不同格式的视频文件。VideoFileClip类的构造函数参数如下:

  • filename:视频文件名,一般常见格式都支持;
  • has_mask:是否包含遮罩;
  • audio:是否加载音频;
  • audio_buffersize:音频缓冲区大小;
  • target_resolution:加载后需要变换到的分辨率;
  • resize_algorithm:调整分辨率的算法,默认是 bicubic,可以设置为 bilinear,fast_bilinear;
  • audio_fps:声音的采样频率;
  • audio_nbytes:采样的位数;
  • verbose:是否输出处理信息。

2、视频输出:write_videofile或to_videofile方法用于视频输出,可以将处理之后的视频写入本地。

视频转换gif

from moviepy.editor import VideoFileClip
clip = VideoFileClip('./21.mp4')
clip.write_gif('21.gif')
# clip.write_gif('21.gif', fps=1)  # fps设置每秒的帧数,这将直接影响gif文件的大小(帧数越小,文件越小),不设置的时候,默认取视频的原帧数

gif缩放:视频分辨率往往比较高,直接转化为Gif,比较大,不利于网络传播,所以可以使用resize,来进行缩放

clip = (VideoFileClip("21.mp4").subclip(1, 3).resize(0.5))  # 宽度和高度乘以0.1
clip.write_gif("Video.gif")

视频裁剪

用 subclip 这个方法就可以实现视频的截取,添加参数传入起始时间和结束时间即可截取视频中的指定部分。subclip(t_start,t_end) 方法中的时间参数:

  • t_start默认为开始0秒,t_end 的默认值就是视频的长度(最后时间),可支持负数,表示结束前N时间点
  • 以秒表示: (t_start=10) 表示从开始时间的10s开始裁剪到最后。
  • 以分秒表示: (t_start=(1,20)) 表示从开始时间的1分20秒开始裁剪到最后。
  • 以时分秒表示: (t_start=(1,1,20)) 或者 (t_start=(01:01:20))表示从开始时间的1小时1分20秒开始裁剪到最后
clip = VideoFileClip(video_path)
video_clip = clip.subclip(5, -2)  # 表示从5s开始到结束前2s截止之前的视频
video_clip.to_videofile('demo_video001.mp4')

视频音量调节

video = VideoFileClip(video_path)
video = video.volumex(0.5)   # 调整音量,变为原来的0.5
video_file.write_videofile('volumex_video.mp4')

去掉视频声音

video_file = VideoFileClip('demo_video.mp4')
video_file = video_file.without_audio()
video_file.write_videofile('out_audio.mp4')

视频中的音频提取与替换

video1, video2 = VideoFileClip('demo_video.mp4'), VideoFileClip('21.mp4')
audio1 = video1.audio  # 提取第一个视频的音频部分(可截取部分音频,使用subclip()先将读取的视频文件截取后再操作即可)
# audio1.write_audiofile('audio.mp3') # 可以保存提取的音频为MP3格式文件
video3 = video2.set_audio(audio1)  # 将提取的视频1的音频合成到2视频中
video3.write_videofile('demo001.mp4')

获取视频属性

video = VideoFileClip('demo_video.mp4')
print(video.size)  # 获取分辨率大小
print(video.w, video.h)  # 获取宽高
print(video.fps)  # 获取帧数
print(video.duration)  # 获取视频时长

# 使用OS模块获取大小
import os
# 方法1:
video_size = os.stat('demo_video.mp4').st_size
print(video_size, video_size / 1024 / 1000)  # 经测试除以1024**2与原来的大小相差大,除以(1024*1000)的结果和实际大小基本一致
# 方法2:
size = os.path.getsize('demo_video.mp4')
print(size)

案例:获取视频时长

import cv2
import time
from moviepy.editor import VideoFileClip


def video_duration_1(filename):
    start = time.time()
    clip = VideoFileClip(filename)
    end = time.time()
    spend = end - start
    print("获取视频时长方法1耗时:", spend)
    return float(clip.duration)


def video_duration_2(filename):
    start = time.time()
    cap = cv2.VideoCapture(filename)
    if cap.isOpened():
        rate = cap.get(5)
        frame_num = cap.get(7)
        # print(rate, frame_num)
        duration = frame_num / rate
        end = time.time()
        spend = end - start
        print("获取视频时长方法2耗时:", spend)
        return duration
    return -1


if __name__ == '__main__':
    file = "demo_video.mp4"

    video_time_1 = video_duration_1(file)
    print(video_time_1)

    print("*" * 100)

    video_time_2 = video_duration_2(file)
    print(video_time_2)

倍数播放视频

speedx()方法设置要加速到的倍数

video = VideoFileClip('demo_video.mp4')
video_speed = video.speedx(2)  # 设置两倍速度播放
video_speed.write_videofile('speed2.mp4')

截取视频某帧为封面

t默认为0,保存0秒时的一帧,t标识保存某时间的那一帧,时间单位为秒

video = VideoFileClip('demo_video.mp4')
video.save_frame('frame.jpg', t=3)

多视频拼接

多视频按顺序前后拼接

多个clip进行拼接,并不需要这些clip之间有相同的尺寸、时长等,仅仅是将它们按照顺序拼接起来

'''

from moviepy import editor

videos = ["1.mp4", "2.mp4", "3.flv", "4.mp4", "5.flv"]

clips = []

for video in videos:

clips.append(editor.VideoFileClip(video))

editor.concatenate_videoclips(clips).write_videofile("xxx.mp4")

'''

from moviepy.editor import VideoFileClip, concatenate_videoclips

video1, video2 = VideoFileClip('demo_video.mp4').subclip(0, 2), VideoFileClip('demo_video.mp4').subclip(-6,-2)
video_con = concatenate_videoclips([video1, video2])   # 可以指定一个transition参数(也是一个VideoFileClip对象),作为衔接之间的过渡
video_con.write_videofile('splicing_video.mp4')

多视频显示在同一个屏幕

from moviepy.editor import VideoFileClip, vfx
from moviepy import editor

video = VideoFileClip('demo_video.mp4').margin(10)  # margin设置外边距
video1, video2 = video.fx(vfx.mirror_x), video.fx(vfx.mirror_y)  # x轴镜像;y轴镜像
video3 = video.resize(.5)  # 等比缩放

# 列表里面有两个列表,所以会将屏幕上下等分
# 上半部分显示 video1, video2
# 下半部分显示video3, video
video_clip = editor.clips_array([[video1, video2], [video3, video]])
video_clip.to_videofile('joint_video.mp4')

音频处理

替换视频文件的音频

from moviepy.editor import VideoFileClip, AudioFileClip

video = VideoFileClip('demo_video.mp4')
audio = AudioFileClip('红尘.mp3')
video = video.set_audio(audio)  # 給視頻文件設置新的音頻
video.audio.to_audiofile('old_audio.mp3')  # 保存在視頻中提取的音頻
video.write_videofile('change_audio.mp4')

多个音频文件拼接

from moviepy.editor import AudioFileClip, concatenate_audioclips

audio1, audiio2 = AudioFileClip('红尘.mp3'), AudioFileClip('听见凉山.mp3')
join_audio = concatenate_audioclips([audio1, audiio2])
join_audio.to_audiofile('new_audio.mp3')

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自学Docker】Docker stats命令

Docker stats命令 大纲 docker stats命令教程 docker stats 命令可以用于动态显示 Docker容器 的资源消耗情况,包括:CPU、内存、网络I/O。docker stats命令也可以指定已停止的容器,但是不会返回任何信息。 docker stats命令语法 haicoder…

Windows下载安装Nignx

下载 下载地址:http://nginx.org/en/download.html 下载完成以后,得到nginx压缩包; Nginx启动 方式一:可执行文件启动 双击nginx.exe启动 现在,我们打开任务管理器,如果发现nginx进程存在,说明启动完成; 方式二:命令行启动 进入nginx所在…

【Mysql第三期 基本查询语句结构】

文章目录1. SQL概述1.1 SQL背景知识1.2SQL 分类2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 (建议遵守)2.3 注 释2.4 命名规则(暂时了解)3.基本的SELECT语句3.1 查询基本结构3.2 列的别名3.3 去除重复行扩展windows cmd…

同步FIFO设计verilog设计及仿真

同步FIFO设计 1.功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计。由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出。写入和读出的操作由时钟的上升沿触发。当FIFO的数据满和空的时候分别设置相应的高电平加以指示。 2.顶层信号定义: 信号名…

最小生成树问题(Prim算法和Kruskal算法)

问题引入: 这算是一道模板题了,只不过这次在做的时候感觉又学到了些新的东西,之前都是数据结构里学的,因为用惯了C,所以就想摆脱那些邻接数组之类的写法,用STL试一下,在其中把我遇到的一些问题写…

【论文翻译】边缘应用中加速卷积神经网络的剪枝算法综述

摘要 随着卷积神经网络(CNN)模型大小的增加,模型压缩和加速技术对于在边缘设备上部署这些模型变得至关重要。在本文中,我们对修剪进行了全面的调查,这是一种主要的压缩策略,可以从CNN模型中删除非关键或冗…

iOS_Memory Leak 内存泄露治理

1、内存分类 官方文档介绍 app 的内存分三类: Leaked memory:Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument) Abandoned memory:Memory still referenced b…

设计模式 - 结构型模式_桥接模式

文章目录结构型模式概述CaseBad ImplBetter Impl小结结构型模式 结构型模式主要是解决如何将对象和类组装成较大的结构, 并同时保持结构的灵活和⾼效。 结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理,这7类 概述 桥接模式的…

2023牛客寒假算法基础集训营4

A-清楚姐姐学信息论 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 不同进制对于信息的表示效率不同,清楚姐姐最近学习了信息论中使用不同进制表示信息的方法,她现在想要比较两种不同进制表示信息时,谁的…

从软件角度看PCIe设备的硬件结构

从软件角度看PCIe设备的硬件结构 文章目录从软件角度看PCIe设备的硬件结构参考资料:一、 PCIe接口引脚二、 从软件角度理解硬件接口2.1 PCI/PCIe地址空间转换2.2 PCIe上怎么传输地址、数据三、 PCIe系统的硬件框图致谢参考资料: 《PCI Express Technolo…

ElasticSearch概念与架构原理

文章目录一、概述二、ElasticSearch架构原理三、ElasticSearch搜索入门一、概述 ElasticSearch简介 简介 ES是建立在Lucene基础之上的分布式准实时搜索引擎,它所提供的诸多功能中有一大优点,就是实时性好。比如:在业务需求中,新增…

计算机图形学 第7章 自由曲线曲面

先说好,第八章不学。 目录学习目标曲线与曲面的表示形式插值与逼近Bezier曲线定义一次Bezier曲线二次Bezier曲线⭐⭐⭐三次Bezier曲线⭐⭐⭐三次Bezier曲线的Bernstein基函数:Bernstein基函数的性质Bezier曲线的性质de Casteljau算法几何作图法绘制Bezie…

Struts2之拦截器

Struts2之拦截器1、Struts2体系架构1.1、执行流程1.2、核心接口和类1.3、流程简图2、Struts2拦截器2.1、使用拦截器的目的2.2、拦截器的简介2.3、拦截器的工作原理2.4、拦截器的使用2.4.1、创建自定义拦截器2.4.2、struts.xml中定义和配置拦截器2.4.3、Struts2默认拦截器2.4.4、…

Leetcode.2319 判断矩阵是否是一个 X 矩阵

题目链接 Leetcode.2319 判断矩阵是否是一个 X 矩阵 Rating : 1201 题目描述 如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X矩阵 : 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0 给你一个大小为 n x n的二维整数数组 grid&#…

ElasticSearch - 旅游酒店案例es功能实现

目录 案例 搜索与分页功能 条件过滤功能 附近的酒店功能 广告置顶功能 HotelService(es操作)总览 案例 搜索与分页功能 案例需求:实现旅游的酒店搜索功能,完成关键字搜索和分页实现步骤如下:1.定义实体类,接收前端请求实体…

微信小程序用vant自定义tabbar页面并跳转相应页面

0.前置安装 步骤一 安装 vant 组件库 npm i vant/weapp -S --production下载完后要npm构建才能使用 步骤二 修改 app.json 将 app.json 中的 "style": "v2" 去除,小程序的新版基础组件强行加上了许多样式,难以覆盖,不…

分布式定时任务框架选型

目录 1. 前言 2. 定时任务框架 3. 分布式任务调度系统对比 4. 和quartz框架对比 5. 综合对比 6. 总结和结论 7. 附定时任务的其他方案 1. 前言 我们先思考下面几个业务场景的解决方案: 支付系统每天凌晨1点跑批,进行一天清算,每月1号进行上个月清…

【算法】快速排序算法原理及实现

1.什么是快速排序算法 快速排序是对冒泡排序的一种改良版,通过一趟排序,把要排序的序列分割成两个部分,一部分的所有数据要比另一部分的数据都小,然后再根据这两部分的数据来进行快速排序。以此来达到整一个数据都变成了有序序列…

AI算法创新赛-人车目标检测竞赛总结01

AI0000020摘要:人车目标检测竞赛主要考察目标检测算法与 TPU 部署推理,主要考察算法选型与调 优,面向算能 TPU 迁移部署与推理加速两项能力;主要考核目标是算法效果(mAP)与推 理性能(单张图片推理时间)。针对这些要求,笔者从算法选型&#xf…

【实际开发11】- 统计 / 科学计算 - 1

目录 1. sql 统计返回值为 null 时 , 赋值 为 : 0 ( return UI ) 1. 手动 null 判断 , 进行 “0” 赋值 2. XxxxVO 展示对象 , 初始化时 , 赋值默认值 ( 待优化 ) 2. 统计异常 1. 注意中间表数据的维护 ( 同步删除 / 避免手动删数据 ) 3. 精度损失 1. Java 类型 float、…