jjzjj

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

觅远 2023-08-02 原文

目录

视频处理

视频加载和输出

视频转换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')

 

有关python+moviepy音视频处理(一):基本操作的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  9. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  10. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

随机推荐