Python玩转各种多媒体,视频、音频到图片
我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑、字幕编辑、分离音频、视频音频混流等。又比如对音频文件的操作:音频剪辑,音频格式转换。再比如我们最常用的图片文件,格式转换、各个属性的编辑等。因为多媒体文件的操作众多,本文选取一些极具代表性的操作,以代码的形式实现各个操作。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
一、图片操作
操作图片的模块有许多,其中比较常用的两个就是 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对视频/音频文件进行详细信息采集,并进行去重操作 转载请注明出处 一.关于为什么用pymediainfo以及pymediainfo的安装 使用python对视频/音频文件进行详 ...
- ffmpeg+Python实现B站MP4格式音频与视频的合并
目录 安装 官网下载 环境变量 验证 ffmpeg的使用 Python实现自动处理 文件结构 番剧缓存结构 常规缓存结构 文件信息 代码 具体代码 代码说明 安装 官网下载 http://ffmpeg ...
- 树莓派小车By 树莓派爱好者ITJoker(通过python socket通信实现树莓派视频小车)(一)
本文由树莓派爱好者ITJoker 编辑,转载请注明出处.本人也有新浪博客同样是树莓派爱好者ITJoker 所需材料:树莓派2B或者2B以上,L2985n驱动板,若干排线,电池及电池盒,usb无线网卡( ...
- Python玩转微信小程序
用Python玩转微信 Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat. ...
- 用Python玩转微信
Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat.readthedocs.io ...
- [Tools] 多媒体视频处理工具FFmpeg
FFMpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/ ...
- Python玩转人工智能最火框架 TensorFlow应用实践
Python玩转人工智能最火框架 TensorFlow应用实践 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...
- 使用Python玩转WMI
最近在网上搜索Python和WMI相关资料时,发现大部分文章都千篇一律,并且基本上只说了很基础的使用,并未深入说明如何使用WMI.本文打算更进一步,让我们使用Python玩转WMI. 1 什么是WMI ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(四)
本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...
随机推荐
- C#学习与个人总结
本学期的C#相对来说,自我学习方法大有收获.但自律性.自我约束能力,我是否达到预期的最好效果,这个很难说出口.本学期在图书馆借了一本MySql.微机原理的书看了看,记了一些笔记.感觉知识有一些相同,有 ...
- java 基本语法(十三) 数组(六)数组的常见异常
1.数组角标越界异常:ArrayIndexOutOfBoundsException int[] arr = new int[]{1,2,3,4,5}; // for(int i = 0;i <= ...
- 前端08 /jQuery标签操作、事件
前端08 /jQuery标签操作.事件 目录 前端08 /jQuery标签操作.事件 1.标签内文本操作 1.1 html标签元素中的所有内容 1.2 text 标签元素的文本内容 2.文档标签操作 ...
- 04-Python函数
一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...
- CSS文本溢出,显示省略号(...)
方式1:这种方式就是必须要跟width搭配使用,当你使用的display:flex; 的时候可能会影响样式 width: 200px; overflow: hidden; /*超出部分隐藏*/ tex ...
- Python | Python初学者的自我修养,找到自己的方向
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第21篇文章,我们继续多线程的话题. 上周的文章当中我们简单介绍了线程和进程的概念,以及在Python当中如何在主线 ...
- Burp Suite Target Module - 目标模块
模块目的之一:获取网站分析 1.从Proxy - HTTP history界面选中需要加入Target Scope的Host 地址,右击,选中Add to Scope. 2.打开Target - Sc ...
- 主席树铺垫——总区间第k小
题目描述(口糊) 先给定一个长度为n的数列,然后给m次操作,每次输入b,求第b小的数. 样例输入 5 7 4 10 9 23 5 1 2 3 4 5 样例输出 4 7 9 10 23 数据范围及温馨提 ...
- 【Python学习笔记五】re.findall()方法中,正则的"()"效果
在笔记四中,使用正则去筛选数据时,使用了findall()这个方法,在使用时正则表达式中使用了到了"()",最初以为只是强调执行优先级,后来发现正则表达式中的每一个(),在find ...
- 生态 | Apache Hudi集成Alluxio实践
原文链接:https://mp.weixin.qq.com/s/sT2-KK23tvPY2oziEH11Kw 1. 什么是Alluxio Alluxio为数据驱动型应用和存储系统构建了桥梁, 将数据从 ...