проблема с переписыванием WAV-файла в Python - PullRequest
0 голосов
/ 21 сентября 2019

У меня проблема с перезаписью 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

Спасибо за помощь!

1 Ответ

0 голосов
/ 21 сентября 2019

На 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))

, тогда я получаю те же значения - поэтому волна должна звучать одинаково.

это также работает, если я использую байты 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).

...