pyqt5:python读取二进制文件(音频PCM文件)显示波形

news/2024/4/28 1:25:35/文章来源:https://blog.csdn.net/hwd00001/article/details/128946388

文章目录

  • 1.使用ffmpeg生成PCM文件
    • 1.1 用 ffprobe 查看文件信息
    • 1.2 用 ffmpeg 命令转换
    • 1.3 用ffplay 测试播放PCM文件
  • 2.python读取PCM文件显示波形
    • 2.1 函数numpy.fromfile
    • 2.2 数据类型dtype说明

有个项目需要输出10-50Hz的低频信号驱动线圈,考虑使用音频功放硬件,所以做这方面的预研。
参考文章:

  1. 作者:很久没安静的回忆了,文章:音频 PCM 详解
  2. 作者:怪我冷i,文章:音视频从入门到精通——FFmpeg分离出PCM数据实战
    3.作者:cuijiecheng2018,文章:windows下使用FFmpeg生成PCM音频文件并播放(通过命令的方式)

1.使用ffmpeg生成PCM文件

ffmpeg作为开源软件,应用非常广泛,这里我们借用它来把mp3转化成PCM文件。PCM文件没有文件头,帧头等信息,直接就是二进制的音频数据。播放时需要的 采样率,位深,大小端存储,通道 等信息,PCM文件也没有包含,使用ffmpeg播放时需要指定这些信息(由于PCM文件是自己生成的,所以我们知道这些信息的)。

首先选一个mp3文件,我选的源文件是一首5分钟长的歌曲,我先用格式工厂把它分割成3部分,取其中一部分,不需要太大的数据,分割后的文件大小为1.46MB,时长01:36,如下图:
在这里插入图片描述
把Part2.mp3放到ffmpeg目录下,打开windows shell,进入ffmpeg目录。

1.1 用 ffprobe 查看文件信息

>ffprobe -i Part2.mp3Duration: 00:01:36.31, start: 0.025057, bitrate: 128 kb/sStream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/sMetadata:encoder         : Lavc59.12

1.2 用 ffmpeg 命令转换

为了方便查看数据,我选择单通道输出

>ffmpeg -i Part2.mp3 -ar  22050 -ac 1 -f s16le Part2.pcm
Stream mapping:Stream #0:0 -> #0:0 (mp3 (mp3float) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, s16le, to 'Part2.pcm':Metadata:title           : 距离 (我不é
)album           : 我很忙genre           : Popartist          : 周杰伦album_artist    : 周杰伦composer        : 周杰伦comment         : ExactAudioCopy v0.99pb3DISCID          : ISCIDencoder         : Lavf59.27.100Stream #0:0: Audio: pcm_s16le, 22050 Hz, mono, s16, 352 kb/sMetadata:encoder         : Lavc59.37.100 pcm_s16le
size=    4146kB time=00:01:36.28 bitrate= 352.8kbits/s speed= 606x
video:0kB audio:4146kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%

命令简单解释:

# 输入文件
-i 
# 格式
-f fmt              force format
#这里的参数 s16le 表示 数据格式为有符号16bit 整型,小端存储格式
#设置音频采样率
-ar rate            set audio sampling rate (in Hz)
#设置音频通道数
-ac channels        set number of audio channels
#最后的参数为输出文件名

1.3 用ffplay 测试播放PCM文件

ffplay -ar 22050 -ac 1 -f s16le -i  Part2.pcm

在这里插入图片描述
可以在电脑中播放出正常的音乐,说明这个PCM文件是有效的。

2.python读取PCM文件显示波形

使用下面的代码:

import matplotlib.pyplot as plt  #画图包
import numpy as np 
cnt=500
#	1.设定文件的格式为小端,16bit有符号整型,小端存储
dt = np.dtype('<h')
#	2.读取二进制文件,作为y轴数据
y=np.fromfile('Part2.pcm', dtype=dt, count=cnt, sep='', offset=20000)
#	3.生成x轴数据
x=np.linspace(1, cnt,cnt, dtype=int)
print(x)
print(y)
#	4.绘制成图表
plt.plot(x,y,'bp--') #
#	5.显示图表
plt.show()

改变offsetcnt可以查看自己想看的某段数据图表。
在这里插入图片描述

2.1 函数numpy.fromfile

y=np.fromfile(‘Part2.pcm’, dtype=dt, count=cnt, sep=‘’, offset=20000) dt的含义详见下一节。表示以16位bit的带符号整型数据类型和小端存储格式读取文件名为“Part2.pcm”的二进制文件,从偏移量为20000个字节的位置开始读取500(cnt=500)个数据。
参数说明:

参数类型说明
filefile 或 str 或 Path打开文件对象或文件名。
dtypedata-type可选.返回数组的数据类型。对于二进制文件,它用于确定文件中各项的大小和字节顺序。支持大多数内置数字类型,并且可能支持扩展名类型。
countint要读取的项目数。-1表示所有项目(即完整文件)。
sepstr如果文件是文本文件,则项目之间的分隔符。空(“”)分隔符表示文件应被视为二进制文件。分隔符中的空格(“”)匹配零个或多个空格字符。仅由空格组成的分隔符必须至少匹配一个空格。
offsetint与文件当前位置的偏移量(以字节为单位)。默认值为0。仅允许用于二进制文件。

2.2 数据类型dtype说明

dt = np.dtype(‘<h’) 表示小端存储,16bit带符号整型。

类型字符代码
bool?, b1
int8b, i1
uint8B, u1
int16h, i2
uint16H, u2
int32i, i4
uint32I, u4
int64q, i8
uint64Q, u8
float16f2, e
float32f4, f
float64f8, d
complex64F4, F
complex128F8, D
stra, S(可以在S后面添加数字,表示字符串长度,比如S3表示长度为三的字符串,不写则为最大长度)
unicodeU
大端存储>
小端<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_255497.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK9 新特性详解,2017-09-21 正式发布

1、Java9 新特性之目录结构 包含 [jdk8](https://so.csdn.net/so/search?qjdk8&spm1001.2101.3001.7020) 及以前的 jdk 版本&#xff0c;所有目录结构以及目录含义如图&#xff1a;jdk9 之后&#xff0c;目录结构发生变化如图&#xff1a;这个新特性只要了解下就可以了&am…

ChatGPT的火爆出圈,你对它有几分了解?

文章目录1.ChatGPT是什么&#xff1f;2.ChatGPT能做什么&#xff1f;2-1.什么是自然语言模型&#xff1f;3.ChatGPT带来的评价4.了解完ChatGPT之后&#xff0c;你会有什么反思&#xff1f;4-1.为什么微软不自己研发ChatGPT&#xff1f;4-2.Elon Musk为什么退出OpenAI公司&#…

深度学习——注意力机制(笔记+代码)

1.从心理学的角度出发 人类根据随意线索&#xff08;随着意志&#xff0c;主动的&#xff0c;有意识&#xff09;和不随意线索&#xff08;无主动&#xff0c;潜意识&#xff09;选择注意点 第一眼看到红色咖啡杯比较突出和易见就是潜意识的不随意线索 随着意识想主动读书&…

谁说菜鸟不会数据分析,不用Python,不用代码也轻松搞定

作为一个菜鸟&#xff0c;你可能觉得数据分析就是做表格的&#xff0c;或者觉得搞个报表很简单。实际上&#xff0c;当前有规模的公司任何一个岗位如果没有数据分析的思维和能力&#xff0c;都会被淘汰&#xff0c;数据驱动分析是解决日常问题的重点方式。很多时候&#xff0c;…

TypeScript快速入门

TypeScript快速入门1.TypeScript介绍1.1.TypeScript为什么要为JS添加类型支持1.2.TypeScript相比JS优势2.TypeScript初体验2.1.安装编译TS的工具包2.2.编译并运行TS代码2.3.简化运行TS代码3.TypeScript常用类型3.1.类型注解3.2.常用基础类型3.3.原始类型 number/string/boolean…

MG996R舵机介绍

舵机简介舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。在高档遥控玩具&#xff0c;如飞机、潜艇模型&#xff0c;遥控机器人中已经得到了普遍应用。舵机主要是由外壳、电路板、驱动马达、减速器与位置…

【c语言技能树】文件

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

NAS系列 硬件选择

转自我的博客文章https://blognas.hwb0307.com/nas/3224&#xff0c;内容更新仅在个人博客可见。欢迎关注&#xff01; 前言 经过《NAS系列 为什么你需要一台NAS》的简单介绍&#xff0c;如果你也决定像我一样组装一台自己的NAS&#xff0c;那么就千万不要错过本文喔&#xff…

负载均衡反向代理下的webshell上传+apache漏洞

目录一、负载均衡反向代理下的webshell上传1、nginx 负载均衡2、搭建环境3、负载均衡下的 WebShell连接的难点总结难点一、需要在每一台节点的相同位置都上传相同内容的 WebShell难点二、无法预测下次的请求交给哪台机器去执行。难点三、下载文件时&#xff0c;可能会出现飘逸&…

【3】深度学习之Pytorch——如何使用张量处理表格数据集(葡萄酒数据集)

张量是PyTorch中数据的基础。神经网络将张量输入并产生张量作为输出&#xff0c;实际上&#xff0c;神经网络内部和优化期间的所有操作都是张量之间的操作&#xff0c;而神经网络中的所有参数&#xff08;例如权重和偏差&#xff09;也都是张量。 怎样获取一条数据、一段视频或…

Springboot + RabbitMq 消息队列

前言 一、RabbitMq简介 1、RabbitMq场景应用&#xff0c;RabbitMq特点 场景应用 以订单系统为例&#xff0c;用户下单之后的业务逻辑可能包括&#xff1a;生成订单、扣减库存、使用优惠券、增加积分、通知商家用户下单、发短信通知等等。在业务发展初期这些逻辑可能放在一起…

openGL学习之GLFW和GLAD的下载和编译

背景:为什么使用GLFW和GLADOPenGL环境 目前主流的桌面平台是GLFW和GLAD之前使用的GLUT和Free GLUT已经基本淘汰了&#xff0c;所以记录一下如何下载GLFW和GLAD并且编译.GLFW下载:An OpenGL library | GLFW复制到你想存放的位置,我这里就存放到C盘Libaray文件夹下了,这里是我存放…

中国区注册使用ChatGPT指南(OpenAI‘s services are not available in your country)

ChatGPT又火了&#xff0c;各大平台热搜提到手软。暴增的访问量&#xff0c;即使强如ChatGPT&#xff0c;也表示顶不住了。Openai表示服务器已满负荷&#xff0c;ChatGPT暂无法提供服务由于目前ChatGPT未在中国开放&#xff0c;所以国内目前是无法注册使用ChatGPT。但我经过一番…

『 MySQL篇 』:MySQL表的聚合与联合查询

基础篇 MySQL系列专栏(持续更新中 …)1『 MySQL篇 』&#xff1a;库操作、数据类型2『 MySQL篇 』&#xff1a;MySQL表的CURD操作3『 MySQL篇 』&#xff1a;MySQL表的相关约束4『 MySQL篇 』&#xff1a;MySQL表的聚合与联合查询目录一. 聚合查询1.1 聚合函数1.2 GROUP BY子句…

Python将字典转换为csv

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…

MySQL篇02-三大范式,多表查询

数据入库时,由于数据设计不合理&#xff0c;会存在数据重复、更新插入异常等情况, 故数据库中表的设计遵循的设计规范&#xff1a;三大范式1.第一范式(1NF)要求数据库的每一列都是不可分割的原子数据项&#xff0c;即原子性。强调的是列的原子性&#xff0c;即数据库中每一列的…

攀升MaxBook P2电脑U盘重装系统方法教学

攀升MaxBook P2电脑U盘重装系统方法教学。攀升MaxBook P2电脑是一款性价比非常高的笔记本。有用户购买了这款电脑后&#xff0c;想要将系统进行重装。今天和大家分享一个U盘重装系统的方法&#xff0c;学会这个方法后以后就可以自己轻松去重装电脑系统了。接下来一起看看具体的…

相机坐标系的正向投影和反向投影

1 、正向投影: 世界坐标系到像素坐标系 世界3D坐标系(x, y, z) 到图像像素坐标(u,v)的映射过程 &#xff08;1&#xff09;世界坐标系到相机坐标系的映射。 两个坐标系的转换比较简单&#xff0c;就是旋转矩阵 平移矩阵&#xff0c;旋转矩阵则是绕X&#xff0c; Y&#xff…

Thread 类及常见方法

Thread 类是 JVM 用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有一个唯一的 Thread 对象与之关联。用我们上面的例子来看&#xff0c;每个执行流&#xff0c;也需要有一个对象来描述&#xff0c;类似下图所示&#xff0c;而 Thread 类的对象就是用来描述一…

分享111个JS焦点图代码,总有一款适合您

分享111个JS焦点图代码&#xff0c;总有一款适合您 111个JS焦点图代码下载链接&#xff1a;https://pan.baidu.com/s/1GxjW5m9DNOPEQd-Qf_gGSA?pwd4aci 提取码&#xff1a;4aci Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj jQuery宽屏左右…