当前位置:   article > 正文

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

moviepy.editor

目录

视频处理

视频加载和输出

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

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

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

  1. clip = (VideoFileClip("21.mp4").subclip(1, 3).resize(0.5)) # 宽度和高度乘以0.1
  2. 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秒开始裁剪到最后
  1. clip = VideoFileClip(video_path)
  2. video_clip = clip.subclip(5, -2) # 表示从5s开始到结束前2s截止之前的视频
  3. video_clip.to_videofile('demo_video001.mp4')

视频音量调节

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

去掉视频声音

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

视频中的音频提取与替换

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

获取视频属性

  1. video = VideoFileClip('demo_video.mp4')
  2. print(video.size) # 获取分辨率大小
  3. print(video.w, video.h) # 获取宽高
  4. print(video.fps) # 获取帧数
  5. print(video.duration) # 获取视频时长
  6. # 使用OS模块获取大小
  7. import os
  8. # 方法1:
  9. video_size = os.stat('demo_video.mp4').st_size
  10. print(video_size, video_size / 1024 / 1000) # 经测试除以1024**2与原来的大小相差大,除以(1024*1000)的结果和实际大小基本一致
  11. # 方法2:
  12. size = os.path.getsize('demo_video.mp4')
  13. print(size)

案例:获取视频时长

  1. import cv2
  2. import time
  3. from moviepy.editor import VideoFileClip
  4. def video_duration_1(filename):
  5. start = time.time()
  6. clip = VideoFileClip(filename)
  7. end = time.time()
  8. spend = end - start
  9. print("获取视频时长方法1耗时:", spend)
  10. return float(clip.duration)
  11. def video_duration_2(filename):
  12. start = time.time()
  13. cap = cv2.VideoCapture(filename)
  14. if cap.isOpened():
  15. rate = cap.get(5)
  16. frame_num = cap.get(7)
  17. # print(rate, frame_num)
  18. duration = frame_num / rate
  19. end = time.time()
  20. spend = end - start
  21. print("获取视频时长方法2耗时:", spend)
  22. return duration
  23. return -1
  24. if __name__ == '__main__':
  25. file = "demo_video.mp4"
  26. video_time_1 = video_duration_1(file)
  27. print(video_time_1)
  28. print("*" * 100)
  29. video_time_2 = video_duration_2(file)
  30. print(video_time_2)

倍数播放视频

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

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

截取视频某帧为封面

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

  1. video = VideoFileClip('demo_video.mp4')
  2. 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")

'''

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

多视频显示在同一个屏幕

  1. from moviepy.editor import VideoFileClip, vfx
  2. from moviepy import editor
  3. video = VideoFileClip('demo_video.mp4').margin(10) # margin设置外边距
  4. video1, video2 = video.fx(vfx.mirror_x), video.fx(vfx.mirror_y) # x轴镜像;y轴镜像
  5. video3 = video.resize(.5) # 等比缩放
  6. # 列表里面有两个列表,所以会将屏幕上下等分
  7. # 上半部分显示 video1, video2
  8. # 下半部分显示video3, video
  9. video_clip = editor.clips_array([[video1, video2], [video3, video]])
  10. video_clip.to_videofile('joint_video.mp4')

音频处理

替换视频文件的音频

  1. from moviepy.editor import VideoFileClip, AudioFileClip
  2. video = VideoFileClip('demo_video.mp4')
  3. audio = AudioFileClip('红尘.mp3')
  4. video = video.set_audio(audio) # 給視頻文件設置新的音頻
  5. video.audio.to_audiofile('old_audio.mp3') # 保存在視頻中提取的音頻
  6. video.write_videofile('change_audio.mp4')

多个音频文件拼接

  1. from moviepy.editor import AudioFileClip, concatenate_audioclips
  2. audio1, audiio2 = AudioFileClip('红尘.mp3'), AudioFileClip('听见凉山.mp3')
  3. join_audio = concatenate_audioclips([audio1, audiio2])
  4. join_audio.to_audiofile('new_audio.mp3')

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/80440
推荐阅读
相关标签
  

闽ICP备14008679号