WAV格式文件无损合并&帧头数据体解析(python)(原创)
一,百度百科

图1 WAV文件帧头data[0:44]数据格式

图2.WAV文件帧头图解
读取WAV文件程序:
import struct
with open('测试音频源1.wav', 'rb') as file:
data=file.read()
# print(len(data))
# print(data[44:])
# print(data[0:4]) # chunkID: b'RIFF'
# length0=struct.unpack('<L', bytes(data[4:8]))
# print(length0) # (140836,)
# print(data[4:8]) # chunkSize: b'$&\x02\x00' WAV文件总byte数
# print(data[8:12]) # format: b'WAVE'
# print(data[12:16]) # Subchunk1 ID: b'fmt '
# length1=struct.unpack('<L', bytes(data[16:20]))
# print(length1) # (16,)
# print(data[16:20]) # format Code: b'\x10\x00\x00\x00'
#
# print(data[20:22]) # Subchunk1 Size: b'\x01\x00'
# print(data[22:24]) # nChannels: b'\x01\x00'
#
# print(data[24:28]) # nSamplesPerSec: b'\x80>\x00\x00'
# print(data[28:32]) # nAvgBytesPerSec: b'\x00}\x00\x00'
#
# print(data[32:34]) # nBlockAlign: b'\x02\x00'
# print(data[34:36]) # wBitsPerSample: b'\x10\x00'
#
# print(data[36:40]) # Subchunk2 ID: b'data'
# length2=struct.unpack('<L', bytes(data[40:44])) # (140800,)
# print(length2)
# print(data[40:44]) # Subchunk2 Size: b'\x00&\x02\x00'
通过将data值输出,可知其是一个byte文件
帧头数据为data[0:44],例如:
其中又划分出3大子块,每个子块又分为若干功能块。有标志位、数据长度、通道数、采样率等等相关参数。
b'RIFF\xac\xdc9\x00WAVEfmt\x10\x00\x00\x00\x01\x00\x01\x00\x80>\x00\x00\x00}\x00\x00\x02\x00\x10\x00data\x80\xdc9\x00'
数据帧为data[44:],剩余的数据即为音频采样数据。
三,WAV文件无损合并
我这种方法只针对通道数、采样率等等(除了文件数据帧长度不同)都相同的多个WAV文件合并,当然如果想要将不同格式的WAV合并也可以先转换成相同格式的文件之后再做操作。
import struct # 用于将chunkSize和Subchunk2 Size进行【long int】(byte型)和 int的转换 # *** 读取WAV音频1 *** #
with open('测试音频源1.wav', 'rb') as file:
data1=file.read() # *** 读取WAV音频2 *** #
with open('测试音频源2.wav', 'rb') as file:
data2=file.read() data_info = data1[:44] # 复制帧头参考
data_out = data1[44:] + data2[44:] # 将两个音频的数据帧合并(都是相同格式)
data_info = data_info[:4] + struct.pack('<L', len(data_out)+44) + data_info[8:]# 更新WAV文件的总byte数(两个文件数据帧和+44)
data_info = data_info[:40] + struct.pack('<L', len(data_out)) + data_info[44:]# 更新WAV文件的数据byte数(两个文件数据帧和) # *** 生成合并后的WAV文件 *** #
with open('测试音频源3.wav', 'wb') as f:
f.write(data_info+data_out) print('完成')
四,常见问题
我之前遇到的问题,直接将两个文件的byte值相加写入新文件,帧头没有更改;这样写的结果就是数据的大小满足两个源文件的和,但是使用播放器播放的时候音频无法正常全部播放。
尤其是我使用阿里云-语音合成api合成的WAV格式音频,它们的格式有一定的问题,每个生成的chunkSize和Subchunk2 Size数值都比实际音频数据长度要大一些,导致我直接将多个音频合并的时候,音频长度超过一定长度,后面的语音就无法播放,但是较少的几段音频合并又可以正常播放,这个地方我一直都没有弄明白,同时我又不想使用第三方的库(主要是觉得要先将音频存起来-之后又读取很麻烦),所以才细心的参看WAV格式文件的相关资料,通过对多个音频的比对发现了这个问题的由来。
备注:如果想要直接使用byte文件进行WAV文件合并一定要在合并后更新相关的数据,与此同时也要注意文件的通道数、采样频率等格式是否相同,一定要转换到相同格式合并才有效
WAV格式文件无损合并&帧头数据体解析(python)(原创)的更多相关文章
- Android音频: 怎样使用AudioTrack播放一个WAV格式文件?
翻译 By Long Luo 原文链接:Android Audio: Play a WAV file on an AudioTrack 译者注: 1. 因为这是技术文章,所以有些词句使用原文,表达更准 ...
- wav格式文件、pcm数据
wav格式文件是常见的录音文件,是声音波形文件格式之一,wav 文件由文件头和数据体两部分组成. 文件头是我们在做录音保存到文件的时候,要存储的文件的说明信息,播放器要通过文件头的相关信息去读取数据播 ...
- 将PCM格式存储成WAV格式文件
将PCM格式存储成WAV格式文件 WAV比PCM多44个字节(在文件头位置多) 摘自:https://blog.csdn.net/u012173922/article/details/78849076 ...
- 音频文件解析(一):WAV格式文件头部解析
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源. 文 ...
- [VB.NET][C#]WAV格式文件头部解析
简介 WAV 为微软开发的一种声音文件格式,它符合 RIFF(Resource Interchange File Format)文件规范,用于保存 Windows 平台的音频信息资源. 第一节 文件头 ...
- linux下alsa架构音频驱动播放wav格式文件
#include<stdio.h> #include<stdlib.h> #include <string.h> #include <alsa/asoundl ...
- 音频文件解析(二):WAV格式文件波形绘制
解析WAV头部信息后,接下来就可以根据相关参数和DATA块数据绘制波形. 1.重新编码(转换为8bits,单声道数据) Public Function GetFormatData(ByVal pDat ...
- C语言解析WAV音频文件
C语言解析WAV音频文件 代码地址: Github : https://github.com/CasterWx/c-wave-master 目录 前言 了解WAV音频文件 什么是二进制文件 WAV的二 ...
- 调用CImg库显示WAV格式音频波形
最近在做傅里叶变换和小波变换时经常要通过显示波形来检验算法,但通过visual studio之类显示波形又显得麻烦,而且不能跨平台. CImg是一个跨平台的C++的图像处理库,提供的图像处理等功能十分 ...
随机推荐
- Linux安装软件的时候出现乱码?
在Linux的中文操作系统下使用xmanager进行软件安装的时候,可能出现乱码界面,可以通过以下方法进行解决 1 修改环境属性 vi /etc/sysconfig/i18n LANG=" ...
- polya定理,环形涂色
环形涂色裸题 #include<iostream> #include<cstdio> #include<algorithm> #include<vector& ...
- HearthBuddy版本收集
Hearthbuddy-20190811-010-0b563c92.exe 20190810-003 SHA-256: b2a03c10124b038d2c48279cc50947907a55c8 ...
- Mac下持续集成-查看占用的端口及kill
(base) localhost:~ ligaijiang$ lsof -i tcp:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Q ...
- 数据库 | SQL 诊断优化套路包,套路用的对,速度升百倍
本文出自头条号老王谈运维,转载请说明出处. 前言 在DBA的日常工作中,调整个别性能较差的SQL语句是一项富有挑战性的工作.面对慢SQL,一些DBA会心烦,会沮丧,会束手无措,也会沉着冷静.斗智斗勇! ...
- 限定某个业务控制方法,只允许GET或POST请求方式访问
可以在业务控制方法前,指明该业务控制方法只能接收GET或POST的请求 @Controller @RequestMapping(value="/user") public clas ...
- CSS三角形的实现原理及运用
原理 css盒模型 一个盒子包括: margin+border+padding+content– 上下左右边框交界处出呈现平滑的斜线. 利用这个特点, 通过设置不同的上下左右边框宽度或者颜色可以得到小 ...
- Spring Boot 2.0 集成 Druid 数据源
一.Maven项目依赖 <!-- 开发者工具(热部署 修改classpath下的文件springboot自动重启) --> <dependency> <groupId&g ...
- 树莓派搭建bt下载机、即是安装transmission
Transmission是一种BitTorrent客户端, 安装:sudo apt-get install transmission-daemon 给用户授权:sudo usermod -a -G p ...
- mysql数据库查找数据的方法。
今日内容 1.外键的变种 唯一索引:关键字 unique(num) 作用:使指定的列,中的属性不能重复,并且加速查找案例:create table t5(id int,num int,unique(n ...