文章目录

  • 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.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()

改变offset和cnt可以查看自己想看的某段数据图表。

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)个数据。
参数说明:

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

2.2 数据类型dtype说明

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

类型 字符代码
bool ?, b1
int8 b, i1
uint8 B, u1
int16 h, i2
uint16 H, u2
int32 i, i4
uint32 I, u4
int64 q, i8
uint64 Q, u8
float16 f2, e
float32 f4, f
float64 f8, d
complex64 F4, F
complex128 F8, D
str a, S(可以在S后面添加数字,表示字符串长度,比如S3表示长度为三的字符串,不写则为最大长度)
unicode U
大端存储 >
小端 <

3.源码和PCM文件链接

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

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

  1. python读取二进制文件_如何用python读取二进制文件?

    我发现用Python读取二进制文件特别困难.你能帮我一把吗?我需要读取这个文件,在Fortran 90中,该文件很容易被int*4 n_particles, n_groups real*4 group ...

  2. RAW图像详解及使用Python读取raw格式图像并显示

    一.RAW图像详解 1.1 什么是raw格式图像? RAW在英文中的解释是未处理的.自然状态的,这也就是RAW文件的真谛.RAW图像就是CMOS或者CCD图像感应器将捕捉到 的光源信号转化为数字信号的 ...

  3. 使用Python读取raw格式图像并显示

    整理日期:2020-02-13 整理内容:使用Python读取raw格式图像并显示 代码如下: import cv2 #OpenCV包 import numpy as np# 首先确定原图片的基本信息 ...

  4. Python读取.dat后缀名文件

    Python读取.dat后缀名文件 .dat文件基本上是没有任何头的二进制文件.对于每个样本,它由(256,256,3)个uint8图像,(64,64,1)uint8深度图和1个uint8标签组成.T ...

  5. python 读取mat文件,python读取并写入mat文件的方法

    先给大家介绍下python读取并写入mat文件的方法 用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); sav ...

  6. Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)

    Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录

  7. python读取txt文件写入-python 读取、写入txt文件的示例

    写入文件 使用open()函数和write()函数 但是有两种写法,分别是'a'和'w' 'a' 表示写入文件 若无该文件会直接创建一个 如果存在这个文件,会接着已有的内容的后面写入 with ope ...

  8. python shp文件_对python 读取线的shp文件实例详解

    如下所示: import shapefile sf = shapefile.reader("e:\\1.2\\cs\\dx_csl.shp") shapes = sf.shapes ...

  9. 使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本

    使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本 文章目录 使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本 前言: 背景 tm ...

最新文章

  1. maven工程中添加scala-library并非idea scala插件
  2. Python基础——数据分析考核(基础版本)
  3. 定期定量采购_定量采购方式
  4. Hybris Commerce里的持久层
  5. python方差分析模型的预测结果怎么看_statsmodels中方差分析表结果解析
  6. PAT乙级1037 在霍格沃茨找零钱
  7. 数学习题:求解不定方程a^2 + b^2 = 3025
  8. Polkadot 0.9.2版本正式发布,对平行链启动至关重要
  9. oracle执行计划没有执行索引,oracle理解执行计划之索引相关
  10. AI和计算机会议,CCF推荐人工智能领域的会议和期刊
  11. 线性代数矩阵秩的8大性质、重要定理以及关系
  12. Mybatis的pooled连接池工作原理
  13. C64x+ CPU中断 .
  14. java 几种生成海报的方式
  15. 45个android实例源码
  16. MUTAN:Multimodal Tucker Fusion For Visual Question Answering
  17. php识别图片的条码,如何用php实现生成条形码图片
  18. 移动广告效果监测,App推广广告投放归因工具
  19. P6SPY(JDBC SQL拦截)的安装和使用
  20. Java集合源码系列(1)---- ArrayList详解

热门文章

  1. 在Python中使用pandas进行文件读取和写入方法详解
  2. laravel导出excel并设置单元格格式
  3. windows10怎么安装c语言,如何在Win10安装Microsoft Visual C ++ 2015运行时
  4. Unity Mecanim 动画系统简介
  5. 使用Mybatis联表查询的几种方式
  6. C++ Primer Plus 学习记录(第五章节-包含练习题答案)
  7. html 提示安装flash插件,flashplayer播放插件无法安装解决方案
  8. 【SQL】SQL安装卸载问题的解决。SQL简直剧毒无比好吧。。。
  9. 百度地图(BD-09)坐标系和高德(GCJ-02)坐标系的相互转换(PHP版)
  10. ethos从入门到精通-7AMD显卡超频