在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_datacode
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))
那么它表明data
和result
是不同的
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文件的问题的主要内容,如果未能解决你的问题,请参考以下文章