У меня есть сервер сокетов, который отправляет данные микрофона через UDP с помощью PyAudio. Код выглядит примерно так:
stream = pa.open(
format=pyaudio.paInt16,
channels=1,
rate=44100,
output=False,
input=True,
input_device_index=0,
frames_per_buffer=4096,
stream_callback=callback
)
def callback(in_data, frame_count, time_info, status):
server_socket.sendto(in_data, udp_client)
Используя Python, легко создать клиент, воспроизводящий аудио в режиме реального времени:
stream = pa.open(
format=pyaudio.paInt16,
channels=1,
rate=44100,
frames_per_buffer=chunk,
output=True,
input=False
)
d = client_socket.recvfrom(chunk)
stream.write(d, chunk)
Даже обработка этого байтового массива в Python это очень просто, с этим oneline:
np.frombuffer(in_data, dtype=np.int16)
Тем не менее я понятия не имею, как обрабатывать эту потоковую передачу в Swift 5. Теперь я попытался сделать то же самое в Swift. Это выглядит примерно так:
var stream_buffer = NSMutableData()
self.connection?.receiveMessage { (data, context, isComplete, error) in
self.stream_buffer.append(data!)
}
И как только stream_buffer получил достаточно данных ...
let format = AVAudioFormat(
commonFormat: AVAudioCommonFormat.pcmFormatInt16,
sampleRate: 44100,
channels: 1,
interleaved: true
)
let buffer_data = stream_buffer as Data
let buffer = buffer_data.toPCMBuffer(format: format!)
toPCMBuffer здесь
Пока что, Я понятия не имею, правильно ли я выполняю преобразование байтовых массивов, или AVPlayer даже поддерживает байтовые массивы Int16. Если нет, то как мне конвертировать stream_buffer
в Float32? Кто-нибудь успешно транслировал звук PCM на iOS?