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

您所在的位置:网站首页 从视频中截取音乐 使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析

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

2024-07-11 10:21| 来源: 网络整理| 查看: 265

文章目录 1 使用moviepy库包提取音频1.1 moviepy库包说明1.2 安装moviepy1.2 使用moviepy提取视频中的音频 2 使用librosa库包读取音频文件,并分析音频文件2.1 librosa库包介绍2.2 使用librosa读取音频文件,并分析音频文件 3 绘制音频信号的强度图3.1 使用matplotlib绘制音频信号强度图3.2 使用librosa画信号强度图

1 使用moviepy库包提取音频 1.1 moviepy库包说明

1、moviepy库包介绍

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

2、moviepy参考文档

moviepy的github官网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)) # # 提取视频中的音频文件 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参考文档

librosa的github官网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: freq type: # 上面的这段音频 采样点共: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__ = "[email protected]" # 1、使用moviepy模块 提取视频中的音频文件 from moviepy.editor import AudioFileClip my_audio_clip = AudioFileClip("./test.mp4") print(type(my_audio_clip)) # # 提取视频中的音频文件 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: freq type: # 上面的这段音频 采样点共: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() 创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3