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


Posted in Python onJune 04, 2020

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

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

一、图片操作

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

1.1、格式转换

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

pip install pillow

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

from PIL import Image
# 读取图像
img = Image.open('ycjc.jpg')
# 显示图像
img.show()

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

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

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

from PIL import Image
# 读取图像
img = Image.open('ycjc.jpg')
# 格式转换,其中A为透明度
png = img.convert('RGBA')
# 保存图像,因为是RGBA格式,所以后缀应该为png
png.save('ycjc.png')

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

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

虽然 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 方法,传入裁剪区域的元组进行裁剪,元组的内容为左上角的坐标(前两个参数)即右下角的坐标(后两个参数)。效果图如下:

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

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秒,因为转场的时候有个重合的效果。当然还有更多的操作,大家可以自己去了解。

三、视频操作

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

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 相关文章推荐
win7 下搭建sublime的python开发环境的配置方法
Jun 18 Python
Python中规范定义命名空间的一些建议
Jun 04 Python
python 重定向获取真实url的方法
May 11 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
如何定义TensorFlow输入节点
Jan 23 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
聊聊python中的异常嵌套
Sep 01 Python
python中常用的数据结构介绍
Jan 12 Python
Python实现滑雪小游戏
Sep 25 Python
Python简单实现词云图代码及步骤解析
Jun 04 #Python
Python坐标轴操作及设置代码实例
Jun 04 #Python
Python flask框架实现查询数据库并显示数据
Jun 04 #Python
使用opencv中匹配点对的坐标提取方式
Jun 04 #Python
Python实现计算图像RGB均值方式
Jun 04 #Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 #Python
Python flask框架实现浏览器点击自定义跳转页面
Jun 04 #Python
You might like
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
javascript制作2048游戏
2015/03/30 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
JS计算距当前时间的时间差实例
2017/12/29 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
JS如何生成动态列表
2020/09/22 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
浅谈Python接口对json串的处理方法
2018/12/19 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
一组SQL面试题
2016/02/15 面试题
应征英语教师求职信
2013/11/27 职场文书
医药工作岗位求职信分享
2013/12/31 职场文书
求职自荐信怎么写
2014/03/06 职场文书
二年级评语大全
2014/04/23 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
赢在中国观后感
2015/06/02 职场文书
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
2022/04/24 Vue.js
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL
Golang gRPC HTTP协议转换示例
2022/06/16 Golang
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技