Python 和 websockets - 发送音频流

4 投票
1 回答
9811 浏览
提问于 2025-04-18 08:11

我搭建了一个套接字服务器,可以把消息发送给所有连接的客户端。我是从Python发送数据到JavaScript。
我想把我的麦克风输入发送给所有正在收听的客户端。
所以在我的Python应用程序中,我这样做:

import pyaudio
import websocket
import json
import struct
import wave
import pickle

#record
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 40

HOST = 'ws://127.0.0.1:8080'

s = websocket.create_connection(HOST)

s.send('Hii')

p = pyaudio.PyAudio()

for i in range(0, p.get_device_count()):
    print(i, p.get_device_info_by_index(i)['name'])

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK,
                input_device_index=1)

print("*recording")

i = 0
frames = []

while i < 20:
    data  = stream.read(CHUNK)
    frames.append(data)
    print(i)
    i += 1

s.send(pickle.dumps(frames))

这里的send('hi')可以成功发送,并且其他连接也能收到这个消息。
我尝试直接发送数据帧,没有进行编码,结果是:

TypeError: an integer is required

如果我用pickle.dumps()对数据帧进行编码,应用程序可以运行,但服务器和客户端都收不到数据。另外,json.dumps()也不行。

raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'\x7f\x03\xa1\x03\x7f\x03=\x03 ...

如果我把数据帧编码成字符串,脚本可以正常运行,没有遇到错误。

我只是试试看。但我真正想做的是把send放在一个循环里,直接把输入流发送到服务器。当我这样做时,出现了以下错误:

ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

我看到循环运行了两次,然后就出错了。为什么会这样?我需要压缩这个流吗?

有什么建议吗?

1 个回答

2

试试这个:

s.send(pickle.dumps(frames), opcode=websocket.ABNF.OPCODE_BINARY)

撰写回答