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

news2025/6/8 11:22:13

文章目录

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

有个项目需要输出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.mp3
  Duration: 00:01:36.31, start: 0.025057, bitrate: 128 kb/s
  Stream #0:0: Audio: mp3, 44100 Hz, stereo, fltp, 128 kb/s
    Metadata:
      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           : Pop
    artist          : 周杰伦
    album_artist    : 周杰伦
    composer        : 周杰伦
    comment         : ExactAudioCopy v0.99pb3
    DISCID          : ISCID
    encoder         : Lavf59.27.100
  Stream #0:0: Audio: pcm_s16le, 22050 Hz, mono, s16, 352 kb/s
    Metadata:
      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
大端存储>
小端<

3.源码和PCM文件链接

https://gitee.com/huangweide001/py-hwd/tree/master/read_pcm_plt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

canal 使用详解

第1章 Canal 简介canal [kənl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费工作原理canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送 d…

[架构之路-104]:《软件架构设计:程序员向架构师转型必备》-14-根据需求用例驱动进行软件架构的模块划分过程

14 用例驱动的模块划分过程描述用例的两种方式&#xff1a;图形描述&#xff1a;用例序列图&#xff0c;直观&#xff0c;但修改不方便&#xff0c;版本控制不方便。文本描述&#xff1a;用例规约描述&#xff0c;不直观&#xff0c;但修改方便&#xff0c;版本控制方便。14.1 …

轻松使用 Python 检测和识别车牌(附代码)

车牌检测与识别技术用途广泛&#xff0c;可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理&#xff0c;检测和识别车牌&#xff0c;最后显示车牌字符&#xff0c;作为…

AWS实战:Dynamodb到Redshift数据同步

AWS Dynamodb简介 Amazon DynamoDB 是一种完全托管式、无服务器的 NoSQL 键值数据库&#xff0c;旨在运行任何规模的高性能应用程序。DynamoDB能在任何规模下实现不到10毫秒级的一致响应&#xff0c;并且它的存储空间无限&#xff0c;可在任何规模提供可靠的性能。DynamoDB 提…

Linux破解root密码

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Linux操作…

Postgresql中不支持事务块中调用plpgsql回滚(多层exception、事务块有检查点)

前言 Postgresql使用子事务来实现EXCEPTION的功能&#xff0c;即在进入EXCEPTION的存储过程前&#xff0c;会自动起一个子事务&#xff0c;如果发生了异常&#xff0c;则自动回滚子事务&#xff0c;达成EXCEPTION的效果。那么如果在事务块内本身就带子事务&#xff08;SAVEPOI…

Python文件操作-代码案例

文章目录文件打开文件open写文件上下文管理器第三方库简单应用案例使用python生成二维码使用python操作excel程序员鼓励师学生管理系统文件 变量就在内存中,文件在硬盘中. 内存空间更小,访问速度快,成本贵,数据容易丢失,硬盘空间大,访问慢,偏移,持久化存储. \\在才是 \的含义…

十分钟上手把玩树莓派——系统创建指南

无意中发现一个落灰的树莓派 故事便开始了…… 准备工作 树莓派 3B一张大于 8G 的 micro SD 卡一个读卡器HDMI 显示器及连接线、键盘、鼠标等外围设备 系统镜像下载 推荐两个树莓派镜像下载网站 树莓派官方网站&#xff1a;https://www.raspberrypi.com/software/树莓派实…

“赶快回家网”首页制作

“赶快回家网”首页制作一、实验名称&#xff1a;二、实验日期&#xff1a;三、实验目的&#xff1a;四、实验内容&#xff1a;五、实验步骤&#xff1a;六、实验结果&#xff1a;七、源程序&#xff1a;八、心得体会&#xff1a;一、实验名称&#xff1a; “赶快回家网”首页…

使用Jmeter抓取手机APP报文并进行APP接口测试

Jmeter是一个比较常用的接口测试工具&#xff0c;尤其是接口性能测试。当然它也可以用来测试手机APP的HTTP接口&#xff0c;我在Fiddler抓取手机APP报文 和 接口测试代理工具charles mock测试 分别介绍了Fiddler和charles 如何抓取APP报文&#xff0c;本文介绍使用Jmeter来抓取…

第六章 关系数据理论(规范化详解)

第六章 关系数据理论 6.1 问题的提出 本章主要讨论关系数据理论。在讨论数据库的时候&#xff0c;绕不开的一个问题是&#xff1a;针对一个具体问题&#xff0c;应该如何构建一个适合他的数据库模式。这是数据库设计的问题&#xff0c;确切地讲是关系数据库逻辑设计的问题。为…

python最新采集某站美女,还不快学起来,下载可能下架视频

前言 大家早好、午好、晚好吖 ❤ ~ 这个页面大家认识吧~ 喜欢看吧 那我们今天就来采集一下它呀~ 开发环境: 版 本: python 3.8 编辑器: pycharm 2022.3.2 专业版 requests >>> pip install requests ffmpeg 音视频合成软件 如果安装python第三方模块: win R 输…

民用建筑电力系统运行和节能中的应用——电力监控系统篇

【摘要】本文中概述电力监控系统结构和作用&#xff0c;通过列举工程实例&#xff0c;详细介绍了电力监控系统在民用建筑电力系统运行和节能中的应用&#xff0c;以及在推广和发展方面需要改进的问题。 【关键词】民用建筑&#xff1b;电力监控系统&#xff1b;运行和节能中的…

cmd常用的操作命令

使用windows系统&#xff0c;通常在cmd中输入指令&#xff0c;会调用相应的一些程序或者执行一些功能&#xff0c;学会使用CMD中的命令&#xff0c;可以加快我们一些操作&#xff0c;省时省力。 ipconfig ------查询IP地址 gpedit.msc-----组策略 sndrec32-------录音机 Nsloo…

小程序自动化测试框架【Minium】系列(三)元素定位详解

元素定位 元素定位&#xff0c;应该是很多UI自动化测试入门学习必会的技能了&#xff0c;下面我将为大家举例演示元素定位的几种方法。 1、CSS选择器 Minium 可以通过 WXSS 选择器定位元素&#xff0c;如下图所示&#xff1a; 如果有[CSS选择器]基础会上手更快 &#xff0c;如…

Maven知识点-插件-maven-surefire-plugin简介

Maven本身并不是一个单元测试框架&#xff0c;Java 世界中主流的单元测试框架为JUnit 和TestNG。 Maven 所做的只是在构建执行到特定生命周期阶段的时候&#xff0c;通过插件来执行JUnit或者TestNG的测试用例。 这一插件就是maven-surefire-plugin&#xff0c;可以称之为测试…

Docker安装ElasticSearch,并进行ik和hanlp分词

我按装的目标: 利用ElastiSearch存储数据&#xff0c;ik和hanlp分词插件 对 搜索词进行分词&#xff0c;在ES存储的库中找到与搜索词相近的内容。 安装感受: 原始环境安装老版本的ES&#xff0c;BUG不断&#xff0c;ES相关解答博客对新手有点不友好&#xff0c;完整的解释不多&…

Elasticsearch7.8.0版本进阶——分布式集群(故障转移)

目录一、Elasticsearch集群的安装1.1、Elasticsearch集群的安装&#xff08;win10环境&#xff09;1.2、Elasticsearch集群的安装&#xff08;linux环境&#xff09;二、故障转移的概述三、故障转移&#xff08;win10环境集群演示&#xff09;一、Elasticsearch集群的安装 1.1…

分布式高级篇1 —— 全文检索

Elasticsearch Elasticsearch简介一、基本概念1、index(索引)2、Type(类型)3、Document(文档)4、倒排索引二、Docker 安装 EL1、拉取镜像2、创建实例三、初步探索1、_cat2、索引一个文档(保存)3、查询文档3、更新文档4、删除文档&索引5、_bulk 批量 AP6、样本测试数据四、进…

安全测试的最常用方法你知道多少呢?

安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程&#xff0c;其主要目的是查找软件自身程序设计中存在的安全隐患&#xff0c;并检查应用程序对非法侵入的防范能力&#xff0c;安全指标不同&#xff0c;测试策略也不同。 但安全是相对的…