使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析

1 使用moviepy库包提取音频

1.1 moviepy库包说明

1、moviepy库包介绍

MoviePy是一个用于视频编辑的Python模块,它可以用于基本操作(如剪切、连接、标题插入)、视频合成(也称为非线性编辑)、视频处理,或创建高级效果。它可以读写最常见的视频格式,包括GIF。

2、moviepy参考文档

1.2 安装moviepy

直接使用pip安装即可:

pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple

1.2 使用moviepy提取视频中的音频

# 1、使用moviepy模块 提取视频中的音频文件
from moviepy.editor import AudioFileClip

my_audio_clip = AudioFileClip("./test.mp4")
print(type(my_audio_clip))  # <class 'moviepy.audio.io.AudioFileClip.AudioFileClip'>

#  提取视频中的音频文件  m4v,mp3等音频格式也是支持的
my_audio_clip.write_audiofile("./extract_audio.wav")
'''
MoviePy - Writing audio in ./extract_audio.wav
MoviePy - Done.
'''

2 使用librosa库包读取音频文件,并分析音频文件

2.1 librosa库包介绍

1、librosa是一个用于音乐音频分析的python包。它提供了创建音乐信息检索系统所必需的构建模块。

2、librosa参考文档

2.2 使用librosa读取音频文件,并分析音频文件

音频数据内容,可以认为记录了:采样频率 和 每个采样点的信号强度 两个部分构成一个音频文件

数据流可以理解为一个数组,按照字节存储

# 2、使用librosa分析音频
import librosa
import numpy as np

# 加载音频文件
audio, freq = librosa.load("./extract_audio.wav")
print(f"audio: {audio} and audio shape: {audio.shape}\nfreq: {freq}")
print(f"audio type: {type(audio)}\nfreq type: {type(freq)}")

time = len(audio) / freq
print(time)  # 94.3
'''
audio: [ 0.          0.          0.         ... -0.00216522 -0.00011788
 -0.00167476] and audio shape: (2079315,)
freq: 22050
audio type: <class 'numpy.ndarray'>
freq type: <class 'int'>


# 上面的这段音频 采样点共:2079315   采样频率为:22050
这段音频的时长为:2079315 / 22050 = 94.3   因此这段音频的时长约为94秒
也就是每秒采样 22050个数据
'''

上面有几个概念:

  • 音频采样点:就是在一段时间内,一共采集了多少个音频数据
  • 音频采样频率:就是在一秒内采样采样多少个采样点

因此可以根据音频采样点和音频采样频率,计算出音频的时长:

音 频 的 时 长 = 音 频 采 样 点 个 数 音 频 采 样 频 率 音频的时长 = \frac{音频采样点个数}{音频采样频率} =

3 绘制音频信号的强度图

3.1 使用matplotlib绘制音频信号强度图

# 3、画出音频的信号强度图
import matplotlib.pyplot as plt

time = np.arange(0, len(audio)) / freq
# np.arange(0, len(audio))  = (0,1,2,3,...,2079314)
print(time.shape)  # (2079315,)
print(np.min(time), np.max(time))  # 94.29995464852608  0.0

fig, ax = plt.subplots()
ax.plot(time, audio)
ax.set(xlabel="Time(s)", ylabel="Sound Amplitude")
plt.show()
# 其实绘制的点一共有2079315个,但是由于我们的时间范围是0-94,因此音频信号看起来很拥挤

在这里插入图片描述

3.2 使用librosa画信号强度图

当然我们可以使用librosa 库的工具来分析,可以修掉音频首尾的其他信息,画信号强度图的方式如下:

# 4、使用librosa画信号强度图
# 当然我们可以使用 librosa 库的工具来分析,可以修掉音频首尾的其他信息,画信号强度图的方式如下:
import librosa.display

audio, _ = librosa.effects.trim(audio)
librosa.display.waveplot(audio, sr=freq)
plt.show()

在这里插入图片描述

完整代码如下:

__Author__ = "Shliang"
__Email__ = "shliang0603@gmail.com"


# 1、使用moviepy模块 提取视频中的音频文件
from moviepy.editor import AudioFileClip

my_audio_clip = AudioFileClip("./test.mp4")
print(type(my_audio_clip))  # <class 'moviepy.audio.io.AudioFileClip.AudioFileClip'>

#  提取视频中的音频文件  m4v,mp3等音频格式也是支持的
# my_audio_clip.write_audiofile("./extract_audio.wav")
'''
MoviePy - Writing audio in ./extract_audio.wav
MoviePy - Done.
'''

# 2、使用librosa分析音频
# 音频数据内容,可以认为记录了:采样频率 和 每个采样点的信号强度 两个部分构成一个音频文件
# 数据流可以理解为一个数组,按照字节存储
import librosa
import numpy as np

# 加载音频文件
audio, freq = librosa.load("./extract_audio.wav")
print(f"audio: {audio} and audio shape: {audio.shape}\nfreq: {freq}")
print(f"audio type: {type(audio)}\nfreq type: {type(freq)}")

time = len(audio) / freq
print(time)  # 94.3
'''
audio: [ 0.          0.          0.         ... -0.00216522 -0.00011788
 -0.00167476] and audio shape: (2079315,)
freq: 22050
audio type: <class 'numpy.ndarray'>
freq type: <class 'int'>


# 上面的这段音频 采样点共:2079315   采样频率为:22050
这段音频的时长为:2079315 / 22050 = 94.3   因此这段音频的时长约为94秒
也就是每秒采样 22050个数据

'''


# 3、画出音频的信号强度图
import matplotlib.pyplot as plt

time = np.arange(0, len(audio)) / freq
# np.arange(0, len(audio))  = (0,1,2,3,...,2079314)
print(time.shape)  # (2079315,)
print(np.min(time), np.max(time))  # 94.29995464852608  0.0

fig, ax = plt.subplots()
ax.plot(time, audio)
ax.set(xlabel="Time(s)", ylabel="Sound Amplitude")
plt.show()
# 其实绘制的点一共有2079315个,但是由于我们的时间范围是0-94,因此音频信号看起来很拥挤


# 4、使用librosa画信号强度图
# 当然我们可以使用 librosa 库的工具来分析,可以修掉音频首尾的其他信息,画信号强度图的方式如下:
import librosa.display

audio, _ = librosa.effects.trim(audio)
librosa.display.waveplot(audio, sr=freq)
plt.show()

创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值