sswwssww
@sswwssww

Как правильно передать .wav клиенту используя socket?

def get_audio(filename):
    with open(filename, 'r', encoding='ansi') as audio:
        content = audio.read()
    return content
...
content = get_audio(filename=yandex_audio_name) 
response_for_client = f'HTTP/1.1\r\nContent-Type: audio/mpeg\r\nContent-Disposition: ' \
                                   f'attachment; filename="1.wav"\r\nTransfer-Encoding: chunked;'\
                                   f'charset=ansi\r\n\r\n{content}'.encode('ansi')
...
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((MY_LOCAL_IP, 5000))
    server_socket.listen()

    while True:
        client_socket, client_addr = server_socket.accept()
        request = client_socket.recv(1024)
        response_for_client = response(request)

        if response_for_client:
            client_socket.sendall(response_for_client)

        client_socket.close()

- есть такой код, запускаю сервер, отправляю запрос на сервер через браузер, получаю файл, НО при воспроизведении он он иногда шипит, пищит. Открываю через notepad++ файл который передавал с сервера и который получил , содержимое одинаковое, кодировка тоже, но 5 байт где то теряются в скачанном файле, но не могу найти в каком месте. Сравниваю их через WinMerge - говорит о том что файлы идентичны. Битрейт передаваемого файла 48000 гц. Не могу понять в чем дело, то ли в кодировках то ли нужно указывать явно битрейт в заголовках. Подскажите, где может быть подвох?
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Звук в этом формате - бинарные данные. Нельзя с ними работать как с текстом.
Вы же открываете файл в текстовом режиме. Не надо так. Открывайте в бинарном, не декодируйте. Отправляйте как байты. Принимайте тоже как байты.
К примеру символы абзацев могут быть проинтерпретированы неправильно и заменены, от этого съедут куски данных, сломается выравнивание.
Я не понял. вы на сокетах имитируете часть http-проткокола. Зачем? Отправляйте либо с сокета на сокет в чистом виде, либо поднимите тривиальный сервер на flask и овспользуйтесь requests, чтобы не изобретать дендро-фекальный велосипед.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы