我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑、字幕编辑、分离音频、视频音频混流等。又比如对音频文件的操作:音频剪辑,音频格式转换。再比如我们最常用的图片文件,格式转换、各个属性的编辑等。因为多媒体文件的操作众多,本文选取一些极具代表性的操作,以代码的形式实现各个操作。

一、图片操作

操作图片的模块有许多,其中比较常用的两个就是 Pillow 和 opencv ,两个模块各有优势。其中 opencv 是计算机视觉处理的开源模块,应用的范围更加广泛,从图像处理到视频处理,再到物体检测等。而 pillow 相比直线就单纯的多,其大多数操作都是围绕图像而展开的。

1.1、格式转换

图片格式有多种多样,最直观的感受就是图片后缀。而格式之间的差异不仅仅是后缀的差异,最为明显的就是 png 格式图片,同其它图片有着最为直观的区别。下面我们就看看在Python中如何转换格式,我们先安装 pillow 模块:

pip install pillow

然后看看如何导入模块以及如何读取图像:

from PIL import Image

# 读取图像

img = Image.open('ycjc.jpg')

# 显示图像

img.show()

我们有了上面的基础操作之后,就可以开始进行格式转换了,我们用有村大妹子的图片作为素材:

我们可以看到这是一张白色背景的图片,我们将它转成 png 看看效果:

from PIL import Image

# 读取图像

img = Image.open('ycjc.jpg')

# 格式转换,其中A为透明度

png = img.convert('RGBA')

# 保存图像,因为是RGBA格式,所以后缀应该为png

png.save('ycjc.png')

输出的图片我就不放了,我们观察输出图片会发现,白色背景好像变透明了。不要怀疑,这只是心理作用,其实图片看上去是不会有任何变化的。但是实际上图片从原来的 RGB 三个色道变成了 RGBA 四个色道,我们会发现,图片变大了:

虽然 A 色道的透明度全部都是0,但是实际上还是存在这个色道,所以大小方面有了明显的增加。更多转换模式可以参考超全Python图像处理讲解(多图预警)。

1.2、图片裁剪

图片裁剪的操作也非常常用,我们来看看 pillow 如何裁剪图片:

from PIL import Image

# 读取图像

img = Image.open('ycjc.jpg')

# 裁剪图像,调用crop方法,传入裁剪区域的元组

img_crop = img.crop((100, 100, 400, 400))

# 保存裁剪后的图像

img_crop.save('ycjc_crop.jpg')

我们调用 crop 方法,传入裁剪区域的元组进行裁剪,元组的内容为左上角的坐标(前两个参数)即右下角的坐标(后两个参数)。效果图如下:

1.3、截屏

虽然算不上是图像操作,但是还是个非常实用的操作。我们实现截屏是通过ImageGrap类实现的:

from PIL import ImageGrab

# 截取全屏

im = ImageGrab.grab()

# 保存图像

im.save('win.png')

除了截取全屏我们也可以区域截屏:

im =ImageGrab.grab((300, 100, 1400, 600))

参数元组含义与 crop 方法一致。

除了上述操作,还有更多像是添加滤镜、对比度调节、亮度调节、色彩调节等,由于内容众多,所以不在本文详细讨论。

二、音频操作

音频的操作也比较繁多,我们最常用到的就是音频剪辑和音量调节了。我们这里使用 pydub 模块来进行音频文件的操作。

2.1、pydub的安装以及读取音频

安装我们还是使用pip:

pip install pydub

然后我们来读取一个 wav 文件:

from pydub import AudioSegment

# 读取wav格式的音频文件

music = AudioSegment.from_wav('百年孤独.wav')

这样我们就完成了音频文件的读取, wav 文件是一种未经压缩的文件,我们可以通过 pydub 直接读取。读取其它类型的文件 pydub 同样提供了相应的方法:

music = AudioSegment.from_mp3('music.mp3')

music = AudioSegment.from_ogg("music.ogg")

music = AudioSegment.from_flv("music.flv")

因为在实际操作过程中遇到了一个未找明缘由的错误,所以本文的音频操作只针对 wav 格式。

2.2、音频剪切

音频剪辑的实现我们是通过类似ndarray的中括号操作的:

# 截取前20秒

clip = music[:20*1000]

# 截取后20秒

clip = music[-20000:]

# 从第20秒截取到第40秒

clip = music[20*1000:40*1000]

剪切好的片段我们可以另外存一个文件:

# 保存文件为clip.mp3,格式为mp3

clip.export('clip.mp3', format='mp3')

3.3、增加/减少音量

音量的控制我们只需要用音频对象加一个常数即可:

# 音量减5

music -= 5

# 音量加5

music += 5

3.4、音频拼接

我们先看看重复拼接:

# 在音频文件末尾重复拼接该音频

music = music*2

拼接后的音频的效果就是原音频循环两次。接下来我们看看拼接不同的音频:

# 裁剪前20秒音频

clip1 = music[:20*1000]

# 裁剪后20秒音频

clip2 = music[-20*1000:]

# 拼接音频

clip = clip1 + clip2

3.5、 交叉渐入渐出

交叉渐入渐出是一种比较柔和的音频转场方式,在两个音频切换的间歇会有一个重合,用代码实现如下:

# 截取前20秒

begin = music[20*1000:40*1000]

# 截取后20秒

end = music[-20*1000:]

# 添加交叉渐入渐出 效果

clip = begin.append(end, crossfade=1500)

我们可以看到我们一共裁剪了40秒,在生成的文件我们可以看到只有38秒,因为转场的时候有个重合的效果。当然还有更多的操作,大家可以自己去了解。

三、视频操作

视频的操作可以通过 moviepy 和 opencv 进行,我们先分别安装两个模块:

pip install opencv-python

pip install moviepy

3.1、视频剪辑

相比之下 moviepy 操作视频要更便利,我们看看使用 moviepy 如何剪辑视频:

from moviepy.editor import *

# 剪切视屏bws.mp4中第50秒到第60秒

clip = VideoFileClip('bws.mp4').subclip(50, 60)

# 将剪切的片段保存

clip.write_videofile("clip.mp4")

3.2、提取音频文件

在 VideoFileClip 类中,音频文件作为其中的一个参数,我们可以直接获取:

from moviepy.editor import *

# 读取视频文件

video = VideoFileClip('bws.mp4')

# 获取其中音频

audio = video.audio

# 保存音频文件

audio.write_audiofile('audio.mp3')

3.3、混流

我们还可以将音频同视频混流,在moviepy中,提供了一个读取音频文件的类,我们设置视频的音频需要创建这个类的对象:

from moviepy.editor import *

# 读取视频

video = VideoFileClip('bws.mp4')

# 读取音频

audio = AudioFileClip('百年孤独.mp3')

# 设置视频的音频

video = video.set_audio(audio)

# 保存新的视频文件

video.write_videofile('bws_audio.mp4')

3.4、逐帧提取画面

我们都知道,视频是由一帧一帧的图片组成的,我们也可以将画面一帧一帧提取出来:

import cv2

# 读取视频

video = cv2.VideoCapture('bws.mp4')

# 逐帧读取,当还有画面时ret为True,frame为当前帧的ndarray对象

ret, frame = video.read()

i = 0

# 循环读取

while ret:

i += 1

cv2.imwrite('v'+str(i) + '.jpg', frame)

ret, frame = video.read()

上述代码就能将视屏的每一帧以图片的形式保存下来。

3.5、截取gif

截取gif和截取视频没有什么区别,不过为了减少gif的大小,我们通常会对视频进行尺寸缩放:

from moviepy.editor import *

# 读取视频

video = VideoFileClip('bws.mp4')

# 裁剪视频,并缩小一半

video = video.subclip(20, 30).resize((0.5))

# 保存gif图片

video.write_gif('bws.gif')

在上面subclip方法中,我们可以传入元组,例如:

video.subclip((1, 20), (2, 30))

其含义为从1分20秒截取到2分30秒。

总结

到此这篇关于Python中操作各种多媒体,视频、音频到图片的代码详解的文章就介绍到这了,更多相关python多媒体视频音频图片内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: Python中操作各种多媒体,视频、音频到图片的代码详解

本文地址: http://www.cppcns.com/jiaoben/python/316306.html

python使用视频_Python中操作各种多媒体,视频、音频到图片的代码详解相关推荐

  1. python播放视频代码_Python中操作各种多媒体,视频、音频到图片的代码详解

    我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...

  2. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  3. python语言中split-python中的split()函数和os.path.split()函数使用详解

    Python中有split()和os.path.split()两个函数: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. os.path.split():将文件 ...

  4. 将卷积引入transformer中VcT(Introducing Convolutions to Vision Transformers)的pytorch代码详解

    文章目录 1. Motivation: 2. Method 2.1 Convolutional Token Embedding 模块 2.2 Convolutional Projection For ...

  5. html元素自己属性代码,jQuery如何操作HTML的元素和属性?(代码详解例)

    本篇文章给大家带来的内容是介绍jQuery如何操作HTML的元素和属性?(代码详解例),让大家了解jQuery操作元素和属性的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 1 ...

  6. 深度目标检测网络中关于anchor的神之问(配代码详解)(二)

    目录 将所求出的所有anchor都用于计算吗?如何将筛选所用于计算proposal的anchor点? 如何用anchor来计算proposal(分类与边框回归)? 如何根据前景anchor和GT作Bo ...

  7. python中x y表示_Python中表达式x += y和x = x+y 的区别详解

    前言 本文主要给大家介绍的是关于Python中表达式x += y和x = x+y 区别的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 直接看下面代码: x +=y In [66]: id( ...

  8. python非贪婪匹配_Python中关于正则表达式非贪婪以及多行匹配功能详解

    这篇文章主要介绍了Python正则表达式非贪婪.多行匹配功能,结合实例形式分析了Python正则表达式中非贪婪及多行匹配功能的实现方法与相关注意事项,需要的朋友可以参考下 本文实例讲述了Python正 ...

  9. python输入什么就输出什么意思_python中的输入与输出是什么?(实例详解)

    对于第一次接触到python这门编程语言的朋友来说,刚刚开始学习python编程的时候对于python中的输入与输出这一方面的了解比较少,在这篇文章之中我们就来了解一下python输入与输出的相关知识 ...

最新文章

  1. 《星辰变OL》估计很多人看过这书
  2. HTTP GET URL的最大长度
  3. 计算机视觉与深度学习算法工程师面试题整理
  4. IOS Push 证书的重新生成
  5. jdbc查询序列_JDBC –模拟序列
  6. flutter和webapp_Flutter 适配移动端和web不同尺寸
  7. php转换编码去掉bom,UTF-8编码怎么去掉BOM头?
  8. 排除表_【收藏】常见电气故障及排除故障方法
  9. Shell.FlyoutHeader
  10. 【教程6】疯壳·ARM功能手机-中断实验教程
  11. 物业公众号推文范例_《爱物业》物业服务公众号平台
  12. 麦迪逊大学计算机科学咋样,威斯康星大学麦迪逊分校计算机科学
  13. 思维导图软件Mindmanager2018下载
  14. google无法访问此网站
  15. java虚拟机线程数_Java虚拟机最多支持多少个线程?
  16. 2022年团体程序设计天梯赛C++个人题解附带解题思路
  17. 【知识分享】苹果Apple-Mac操作系统OS的Big Sur 和Monterey的异同
  18. 如何为 Exchange 用户添加联系人头像
  19. 腾讯web前端笔试题及个人答案
  20. 利用逻辑分析仪解析串口通讯数据

热门文章

  1. 如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证
  2. python verilog就业_Verilog会被淘汰吗?
  3. python input函数详解_对Python3中的input函数详解
  4. Android解包命令:unpackbootimg与打包命令:mkbootimg使用
  5. V4L2 获取设备支持的分辨率
  6. 笔记3:Tensorflow2.0实战之MNSIT数据集
  7. 运维面试题、学不下去鸡汤
  8. Vue打包时报错:ReferenceError: primordials is not defined
  9. eclipse jdk配置_第一节:学会Java前提-手把手教你配置JDK环境变量
  10. Java面试易错题精选