Python使用struct.unpack处理二进制文件-程序员宅基地

技术标签: python处理wav文件  struct.unpack方法  Python语言  

1、如何处理二进制文件?

        实际案例:

                wav是一种音频文件的格式,音频文件为二进制文件。

                wav文件由头部信息和音频采样数据构成,前44个字节为头部信息,包含声道数、采样频率、PCM位宽等等,后面是音频采样数据。

                使用python分析一个wav文件头部信息,处理音频数据。

        WAV格式如下:

               简单分为两部分,第一部分前44个字节是音频文件的一些信息,第二部分44个字节后面是音频文件的采样数据。

        解决方案:

                open函数想以二进制模式打开文件,指定mode参数为'b'。

                二进制数据可以用fromfile(Python2中可以使用readinto),读入到提前分配好的buffer中,便于数据处理。

                解析二进制数据可以使用标准库中的struct模块的unpack方法。

2、代码演示

 (1)struct.unpack方法简单使用

# 以二进制形式打开文件
f = open('微信语音视频.wav', 'rb')
# 读取前44字节
info = f.read(44)
print(info)

import struct

'''
struct.unpack方法介绍:
    unpack(format, buffer)
    format:解析类型
    buffer:需要解析二进制串
    例: 构造两个字节的二进制串,format默认为小端字节顺序,
        h为16为,结果:2*256+1=513
        struct.unpack('h', b'\x01\x02')
        指定format为大端字节顺序,结果:256+2=258
        struct.unpack('>h', b'\x01\x02')
'''
# print(help(struct.unpack))
# 解析声道数,Num Channels为22到24字节
print(struct.unpack('h', info[22:24]))
# 解析采样频率,SampleRate为24到28字节,i为int类型
print(struct.unpack('i', info[24:28]))
# 编码宽度,BitsPerSample为34到36字节
print(struct.unpack('h', info[34:36]))

 (2)实现二进制文件wav的处理

# _*_ encoding:utf-8 _*_
import array

'''
读取data数据部分不希望是字符串形式,因为字符串不支持数学运算,
对它不方便数据处理,最好读取到类似于C语言中数组中去
'''

# 修改文件指针移动到文件末尾
f.seek(0, 2)
# 报告文件指针,也就是文件大小
print(f.tell())
# 数组的长度为文件字节长度减去44个字节,除2为采样宽度
n = (f.tell() - 44) // 2

# 创建数组,储存data部分数据
buf = array.array('h', [])

# 将文件的数据读入到buf当中,不返回字符串
f.seek(44)
buf.fromfile(f, n)
print(buf[0])
print(len(buf))
# 将采样缩小一定程度,最终体现就是声音变小
for i in range(n):
    buf[i] //= 8
# 将数据存入到一个新文件
f2 = open('demo.wav', 'wb')
f2.write(info)
buf.tofile(f2)
f2.close()

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37189082/article/details/124653895

智能推荐

2019校招面经大汇总-程序员宅基地

文章浏览阅读191次。转载链接:https://www.nowcoder.com/discuss/90907?type=0&order=3&pos=24&page=1【杭州有赞】 【Java】杭州有赞三面技术面试https://www.nowcoder.com/discuss/85395 【多益网络】 【产品研发工程师】多益网络 提前批..._面经vivo2018年校招-简书

git commit提交报错subject may not be empty [subject-empty]-程序员宅基地

文章浏览阅读2.3w次,点赞10次,收藏7次。今天在sourcetree提交写好的代码突然报错,显示如下错误: subject may not be empty [subject-empty] type may not be empty [type-empty]_subject may not be empty

FS102WS是一款用于 LED 灯光开关控制及亮度调节的触摸IC-程序员宅基地

文章浏览阅读187次。每次短按触摸,依OPT1/2/3选择不同,灯光亮度按[高亮度→>中亮度->低亮度->灭]依次循环变化,或[低亮度->中亮度->高亮度->灭]依次循环变化。FS102WS是一款用于 LED 灯光开关控制及亮度调节的触摸IC,支持单通道触摸输入、单路 PWM 输出,可在有介质(如玻璃、亚克力、塑料、陶瓷等)隔离保护的情况下实现触摸功能,可靠性非常高,灯光无闪频。未断电短按开灯后第一次长按调光的方向由之前记忆的亮度值来决定,若记忆亮度值大于45%,则向下调光:若记忆亮度值小于45%,则向上调光。

Python办公自动化实战 09 | Python-docx库:Python与Word的完美结合_ 如何在Word中生成表格?把Python办公自动化进行到底-程序员宅基地

文章浏览阅读911次。本小节主要演示了怎么向Word文档中创建表格并插入数据,并且对表格格式做个性化的设定。_python与word的完美结合

MySQL:从库binlog 使用mysqlbinlog stop-datetime过滤问题-程序员宅基地

文章浏览阅读2k次。更多主从同步相关可以参考我的《深入理解MySQL主从原理》专栏:本文是一个朋友问我问题。从库使用mysqlbinlog..._mysql stop-datetime

SAP入门经验_sap经验-程序员宅基地

文章浏览阅读8k次,点赞18次,收藏30次。SAP入门的经验SAP业务顾问入门确实起点比较高,这在我最开始入门的时候不以为然,但是随着学习的深入,才发现原来老师们说的是真的!简单说一下我自己的入门经历,我是本科是工业工程(IE)专业的,如果有了解的肯定知道这个专业是干什么的,步入这个行业我才发现我所学的专业知识都挺有用的,特别是PP模块,我本身在大学就经常参加一些生产优化案例竞赛,对于排产,MRP等信息有了初步的了解,更重要的是IE专业培养了我的优化意识我感觉这是我的一大笔财富。好了步入正题,说一下我的入门经历:最开始公司培训讲了很多模块的知_sap经验

随便推点

jetson nano ubuntu 安装配置opencv4 cuda10 pytorch_nano 安装cuda10-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏14次。安装cudabashrc文件添加如下export PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH查安装nvcc -V卸载自带opencvsudo apt-get purge libopencv*sudo apt autoremove下载opencv与opencv_contrib版本对应opencv下载opencv_contrib下载编译安装_nano 安装cuda10

【计算机毕设选题】基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉_基于opencv的二维码识别课程设计-程序员宅基地

文章浏览阅读733次,点赞19次,收藏23次。今天学长向大家介绍一个机器视觉的毕设项目,二维码 / 条形码检测与识别基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉。_基于opencv的二维码识别课程设计

互联网医院智慧医院系统_互联网可访问的医院系统有哪些-程序员宅基地

文章浏览阅读8.5k次。什么是互联网医院?我们来看一下百度百科的定义“互联网医院系统”带有在线问诊、随访、慢病管理等功能,它有实体医院作强有力的支撑,线上方便病人,就是简单的问题不需要到医院,在网上就可以进行。可见在线问诊、随访、慢病管理是互联网医院的核心功能,下面我们来逐个分析一下在线问诊:一般是图文问诊、视频问诊、语音问诊、电话问诊几种问诊方式,多种方式方便医患在线沟通随访:医生可以对患者发起线上随访,患者可在线填写随访表单,后台可统计随访结果慢病管理:能对糖尿病、高血压等常见慢性病进行健康管理,医生可以随时查看病人_互联网可访问的医院系统有哪些

IOS开发 生成app图标_ios app图标生成-程序员宅基地

文章浏览阅读1.6k次。IOS开发,给app设置图标_ios app图标生成

[Python] Django 报错记录与解决_importerror: cannot import name 'iterable' from 'c-程序员宅基地

文章浏览阅读6.7k次,点赞3次,收藏17次。配置记录pycharm中打开Django项目并配置虚拟环境运行项目;将Django项目全局配置文件用统一的包进行管理;配置jinja2模板引擎;补充 Jinja2 模板引擎环境报错记录ImportError;You must set settings.ALLOWED_HOSTS if DEBUG is False;'cryptography' package is required;ImproperlyConfigured_importerror: cannot import name 'iterable' from 'collections

JSON文本互转及JsonNode,ObjectNode,ArrayNode简单理解-程序员宅基地

文章浏览阅读5.7k次。JSON文本互转及JsonNode,ObjectNode,ArrayNode简单理解``JsonNode是Jackson中为了处理JOSN文本的树模型(tree model)。可以将JSON文本转成JsonNode,也可以将JsonNode转成JOSN文本。。ObjectNode和ArrayNode都是JsonNode类的扩展,不同的是JsonNode是只读的,而。..._arraynode

推荐文章

热门文章

相关标签