【干货】Python玩转各种多媒体,视频、音频到图片

简介: 【干货】Python玩转各种多媒体,视频、音频到图片

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


一、图片操作

操作图片的模块有许多,其中比较常用的两个就是Pillowopencv,两个模块各有优势。其中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,但是实际上还是存在这个色道,所以大小方面有了明显的增加。

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


三、视频操作

视频的操作可以通过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


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

相关文章
|
6天前
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
17 1
|
8天前
|
数据采集 前端开发 JavaScript
Python爬虫技术:动态JavaScript加载音频的解析
Python爬虫技术:动态JavaScript加载音频的解析
|
9天前
|
数据采集 机器学习/深度学习 搜索推荐
Python第一章(图片与API接口)
Python第一章(图片与API接口)
|
9天前
|
Python
Python使用ffmpeg下载m3u8拼接为视频
Python使用ffmpeg下载m3u8拼接为视频
25 1
|
13天前
|
数据可视化 Python
python WAV音频文件处理——(3)高效处理大型 WAV 文件
python WAV音频文件处理——(3)高效处理大型 WAV 文件
38 9
|
13天前
|
数据管理 Python 内存技术
python WAV音频文件处理—— (2)处理PCM音频-- waveio包
python WAV音频文件处理—— (2)处理PCM音频-- waveio包
42 15
|
13天前
|
存储 Python 内存技术
python WAV音频文件处理—— (1)读写WAV文件
python WAV音频文件处理—— (1)读写WAV文件
43 14
|
14天前
|
机器学习/深度学习 算法 数据可视化
【深度学习实战】基于深度学习的图片风格快速迁移软件(Python源码+UI界面)
【深度学习实战】基于深度学习的图片风格快速迁移软件(Python源码+UI界面)
|
测试技术 Linux API
mutagen-处理音频元数据的Python模块
Mutagen是处理音频元数据的Python模块。它支持ASF,FLAC,MP4,Monkey's Audio,MP3,Musepack,Ogg Opus,Ogg FLAC,Ogg Speex,Ogg Theora,Ogg Vorbis,True Audio,WavPack,OptimFROG和AIFF音频文件。支持所有版本的ID3v2,并解析所有标准的ID3v2.4帧。它可以读取Xing标头,以准确计算MP3的比特率和长度。无论音频格式如何,都可以编辑ID3和APEv2标签。它还可以在单个数据包/页面级别上处理Ogg流。
2171 0
mutagen-处理音频元数据的Python模块
|
1天前
|
索引 Python 容器
Python数据类型:编程新手的必修课
Python数据类型:编程新手的必修课

热门文章

最新文章