Найти - Пользователи
Полная версия: VoIp. Задержка...
Начало » Python для новичков » VoIp. Задержка...
1
WindeL
Подскажите, пожалуйста, как сделать задержку воспроизведения звука, чтобы клиент сказал, а сервер воспроизвел только через секунд 5.
Вот код принимающего сервера:

import pyaudio
import sys
import socket

chunk = 256
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 15000
timer = 0
host = 'localhost'
port = 2000
adr = (host,port)

p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,channels = CHANNELS,rate = RATE,input = True,output = True,frames_per_buffer = chunk)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(adr)

print "Your IP address is: ", socket.gethostbyname(host)
print "Server Waiting for client on port 2000"

while 1:
data,adr = server_socket.recvfrom(1024)
stream.write(data,chunk)
В цикле никак не задержать, иначе он каждый пакет будет задерживать как я понимаю, что приведет к прерывистому вопроизведению….
Или это все осуществляется с помощью таймеров?
o7412369815963
Может как-то так?: в цикле приема, все пакеты складывать в массив и отмечать время их прибытия, а во втором потоке проверять если время пришло то передать пакет в стрим.
WindeL
Т.е. сделать еще один буфер? А как отмечать время их прибытия, плохо это в коде представляю?
o7412369815963
вот пример ключевого кода
q = Queue.Queue()

# добавляем
while 1:
data,adr = server_socket.recvfrom(1024)
q.put( (data,time.time()) )

# обрабатываем в потоке
while 1:
data, t = q.get()
t += 5
time.sleep( t - time.time() )
stream.write(data,chunk)
WindeL
похоже программа в цикле добавления зацикливается и до воспроизведения даже не доходит. А q.put до какого момента будет добавлять данные в очередь, непонятно как вообще из этого цикла выйти…..(сорри, с потоками совсем не дружу пока)
o7412369815963
> похоже программа в цикле добавления зацикливается и до воспроизведения даже не доходит.
поэтому я и сказал что во второй поток.
WindeL
Пример, который ты привел, как я понял, и есть мое решение. И там в первом цикле первый поток принимает и складывает в очередь, во втором цикле идет второй поток, который достает из очереди и воспроизводит. Так вот, пытаясь так реализовать, у меня во второй цикл вообще не заходит, или я неверно пользуюсь отладкой. Как вообще правильно смотреть в отладчике программы с потоками?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB