在python中重写wav文件的问题

Posted

技术标签:

【中文标题】在python中重写wav文件的问题【英文标题】:problem with rewriting a wav file in python 【发布时间】:2019-09-21 10:10:51 【问题描述】:

我在重写 .wav 文件(波形音频文件)时遇到问题。我的项目涉及将波形文件数据转换为数据字节,然后重新组装一个听起来相同的新音频文件。

出于某种原因,当我尝试使用 struct.pack 执行此操作时,结果相似,但不一样 - 看起来像原始数据但不完全一样。

注意:对于普通字符串,它可以工作,但对于写入波形文件的数据类型,它不会。

我将原始数据转换为字节的函数:

def original_data_to_bytes_data(original_data):
"""
params: original data.
returns: all the data in bytes form, list of strings.
"""
original_data = str(''.join(format(ord(i), '08b') for i in original_data))
bytes_data = list()
for i in range(0, len(original_data), 8):
    bytes_data.append(original_data[i:i+8])
return bytes_data

我将字节转换为原始数据的函数:

def bytes_data_to_original_data(bytes_data):
"""
params: bytes_data - data, list of strings.
returns: original data.
"""
original_data =""
for i in bytes_data:
    original_data += struct.pack('i', int(i, 2))
return original_data

感谢您的帮助!

【问题讨论】:

“相似但不一样”?这实际上意味着什么? 转换为字节数据的代码在哪里?也许你的设置不同。 def original_data_to_bytes_data(original_data): """ 参数:原始数据。返回:所有字节形式的数据,字符串列表。""" original_data = str(''.join(format(ord (i), '08b') for i in original_data)) bytes_data = list() for i in range(0, len(original_data), 8): bytes_data.append(original_data[i:i+8]) return bytes_data code def original_data_to_bytes_data(original_data): """ 参数:原始数据。返回:所有字节形式的数据,字符串列表。""" original_data = str(''.join( format(ord(i), '08b') for i in original_data)) bytes_data = list() for i in range(0, len(original_data), 8): bytes_data.append(original_data[i:i+8])返回字节数据 代码、数据和错误消息总是被质疑,而不是评论。它将更具可读性。在评论中你不能格式化文本。 【参考方案1】:

在 Python 3 上,我收到错误消息。在 Python 2 上它可以正常工作,所以我假设您也使用 Python 2。


我检查了这个

data = 'A'
result = bytes_data_to_original_data(original_data_to_bytes_data(data))
print(result)
print(type(data), type(result)) 

它显示相同的文本和相同的类型

但是当我检查时

print(data == result)
print(len(data), len(result))
print(repr(data), repr(result))

那么它表明dataresult 是不同的

False
(1, 4)
("'A'", "'A\\x00\\x00\\x00'")

如果我在代码中使用"B"(字节)而不是"i"(整数)

struct.pack('B', int(i, 2))

然后我得到相同的值 - 所以 wave 听起来也应该一样。

如果我使用字节 b"A" 而不是字符串 "A" 它也有效,因为 Python2 将字节作为字符串。


def bytes_data_to_original_data(bytes_data):
    """
    params: bytes_data - data, list of strings.
    returns: original data.
    """
    original_data = ""
    for i in bytes_data:
        original_data += struct.pack('B', int(i, 2))
    return original_data

编辑:struct.pack() 中,我将'b'(需要值-128..127)更改为'B'(使用值0..255)。

【讨论】:

original_data += struct.pack('b', int(i, 2)) struct.error: 字节格式需要-128 首先使用"i" 并检查print(data == result) print(len(data), len(result)) print(repr(data), repr(result)) 看看你得到了什么result 我在文档中检查了struct 的其他值——也许"B" 可以代替"b""B" 代表unsigned char,表示值0-255 你是对的!我应该使用'B'。你是我的国王,我非常喜欢和欣赏

以上是关于在python中重写wav文件的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用 scipy 和 librosa 读取 wav 文件

在 Python 中更新/附加到 .wav 文件

在 Python 中绘制 Wav 文件视听

在 python 中播放 .wav 文件的一部分

无需在 Python 中写入磁盘即可加入 .wav 文件

如何在 python 中获取声音文件(.wav)的时间长度? [复制]