![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
daff |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.3.2008 Репутация: нет Всего: нет |
Люди, помогите пожалуйста решить проблему!
Необходимо создать приложение, которое вещает речь по сети. С одной стороны человек говорит что-нибудь в микрофон, а с другой принимается и воспроизводится! Я организовал передачу речи, запихивание её в буфер и приём в буфер на другой стороне, но при воспроизведении речи слышны очень сильные щелчки и абсолютно не слышно самой речи - слышно только допустим постукивание по микрофону!В чём может быть проблема?
|
|||
|
||||
Яхонт |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 14.4.2008 Репутация: нет Всего: 1 |
Я конечно не уверен, но у меня была аналогичная проблема, и ее причина крылась в следующем:
Задержки при передаче по сети делают свое черное дело. Тем более, я так понимаю, ты передаешь несжатый звук, а это только усугубляет положение. У каждого сэмпла есть время начала воспроизведения и время конца воспроизведения. Если сэмпл дошел слишком рано, то он придерживается и воспроизводится только когда настанет его время. Если сэмпл дошел слишком поздно, то он игнорируется или воспроизводится только его часть. Теперь смотри, что на самом деле происходит. Это трудно описать текстом, но я все же попытаюсь. Аудиокарта генерирует сэмплы, времена которых (к примеру): 1й сэмпл: от 0,5 сек до 0,51 сек 2й сэмпл: 0,51 сек - 0,52 сек 3й сэмпл: 0,52 сек - 0,53 сек ...... и т. д. В этом случае процесс протекает так: В момент времени 0,495 сек из аудиокарты извлекается 1й сэмпл и передается на воспроизведение, где он придерживается до момента времени 0,5 сек, после чего выводится в динамик. Потом в момент времени где-то 0,505 сек из аудиокарты извлекается 2й сэмпл. Он также передается на воспроизведение, где придерживается до момента 0,51 сек, после чего воспроизводится в динамике, и т. д. Предположим, что на отправку сэмпла по сети уходит 0,3 сек. Смотри, как меняется ситуация: В момент времени 0,495 сек из аудиокарты извлекается 1й сэмпл и передается в сеть в течение 0,3 сек. В момент времени 0,795 он принимается на другой стороне и подается на воспроизведение, но он должен был проигрываться в момент 0,5 - 0,51 (отставание равно 0,295 сек). Тем временем на отправляющей стороне в момент времени 0,795 из аудиокарты извлекается 2й сэмпл (который должен был проигрываться с 0,51 сек по 0,52 сек) и передается по сети. 2й сэмпл принимаетс в момент времени 1,095 сек (отставание уже равно 0,585 сек), и т. д. Таким образом, звук, захваченный за 0,02 сек воспроизводится за 0,695 сек. Далее это отставание бесконечно возрастает и приводит к непредсказуемым результатам. Чтобы выяснить, в этом ли дело, попробуй передавать звук не по сети, а в одном приложении простым копированием данных из буфера в буфер. Задержку сэмулируешь функцией Sleep(..). Тогда все выяснишь. Удачи! |
|||
|
||||
Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: нет Всего: 40 |
-------------------- Бонифаций. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |