Уведомления

Группа в Telegram: @pythonsu

#1 Май 28, 2011 18:56:05

WindeL
От:
Зарегистрирован: 2011-03-30
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

VoIp. Задержка...

Подскажите, пожалуйста, как сделать задержку воспроизведения звука, чтобы клиент сказал, а сервер воспроизвел только через секунд 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)
В цикле никак не задержать, иначе он каждый пакет будет задерживать как я понимаю, что приведет к прерывистому вопроизведению….
Или это все осуществляется с помощью таймеров?



Отредактировано (Май 28, 2011 19:16:29)

Офлайн

#2 Май 28, 2011 20:57:11

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

VoIp. Задержка...

Может как-то так?: в цикле приема, все пакеты складывать в массив и отмечать время их прибытия, а во втором потоке проверять если время пришло то передать пакет в стрим.

Офлайн

#3 Май 28, 2011 21:21:01

WindeL
От:
Зарегистрирован: 2011-03-30
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

VoIp. Задержка...

Т.е. сделать еще один буфер? А как отмечать время их прибытия, плохо это в коде представляю?



Офлайн

#4 Май 28, 2011 21:44:51

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

VoIp. Задержка...

вот пример ключевого кода

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)

Офлайн

#5 Май 29, 2011 00:50:34

WindeL
От:
Зарегистрирован: 2011-03-30
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

VoIp. Задержка...

похоже программа в цикле добавления зацикливается и до воспроизведения даже не доходит. А q.put до какого момента будет добавлять данные в очередь, непонятно как вообще из этого цикла выйти…..(сорри, с потоками совсем не дружу пока)



Отредактировано (Май 29, 2011 00:55:44)

Офлайн

#6 Май 29, 2011 10:21:06

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

VoIp. Задержка...

> похоже программа в цикле добавления зацикливается и до воспроизведения даже не доходит.
поэтому я и сказал что во второй поток.

Офлайн

#7 Май 29, 2011 11:15:31

WindeL
От:
Зарегистрирован: 2011-03-30
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

VoIp. Задержка...

Пример, который ты привел, как я понял, и есть мое решение. И там в первом цикле первый поток принимает и складывает в очередь, во втором цикле идет второй поток, который достает из очереди и воспроизводит. Так вот, пытаясь так реализовать, у меня во второй цикл вообще не заходит, или я неверно пользуюсь отладкой. Как вообще правильно смотреть в отладчике программы с потоками?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version