Звук: запись с микрофона, передача по сети, прослушивание в реальном времени.

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

22 ноя 2007, 09:35

Есть следующая задача. Постоянно записывать звук (в какой-нибудь компактный формат) с постоянно включенного микрофона (в файлы). Плюс возможность "подключения" (не постоянно, а время от времени) с другого компютера с целью в реальном времени услышать происходящее.

Вопрос "общего направления". С помощью какого набора средств это лучше (в т.ч. быстрее и удобнее в смысле разработки) реализовать? Немного пошарил по интернету, создалось впечатление, что существует немало (во всяком случае, более одного) способов. Есть что-то про DirectShow. Если о Win API, то там (как я понял) имеется несколько "наборов" multimedia-функций (с префиксами acm, , mmio, wave).

В каком формате лучше записывать звук? Например, слышал про Speex (вроде бы весьма хорош, используется чть ли не в US Army). Опять же, переводить в нужный формат, как я понял, можно "стандартными" Win API-средствами (если установлен соответствующий кодек), либо "своими средствами" (например, в MP3 кодировать при помощи lame_enc.dll).

Ну и как лучше передавать по сети поток с целью прослушивания его в реальном времени на другом компьютере.

Есть у кого есть опыт в этой области, подскажите, пожалуйста, в каком направлении слдует двигаться (чтобы, так сказать, оптимально совместить качество результата и быстроту разработки :) )

Заранее спасибо.
Аватара пользователя
OHara
Сообщения: 7
Зарегистрирован: 27 ноя 2007, 12:31

27 ноя 2007, 17:30

Для работы с аппаратурой вполне достаточно функций API (mmio и wav). Для передачи голоса по сети, если с обеих сторон будут сервер и клиент Вашей разработки, достаточно организовать свой простенький сигнальный протокол по TCP и передачу голоса по UDP (аналог RTP).
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

27 ноя 2007, 18:13

OHara, спасибо. У меня за прошедшую неделю уже худо-бедно найденный вал информации устаканился и систематизировался.

Еще аот такой вопрос. О группе функций с префиксом mmio. На первый взгяд эти функуии записывают данные (полученные от звуового устройства или откомпрессированные) в файл. В то же время в некоторых примерах при записи WAV-файл "тупо" пользуются "обычными" функциями записи в файл (CreateFile, WriteFile, ...)
Вопрос: Чем полезны (удобны-?) mmio-функции по сравнению с "обычными" файловыми функциями?
Аватара пользователя
OHara
Сообщения: 7
Зарегистрирован: 27 ноя 2007, 12:31

27 ноя 2007, 18:24

очевидно, сервисом, заточенным непосредственно под звуковые файлы. Но если Вы будете сами заполнять соответствующие структуры и двигаться по wav-файлам, то можно и обычными файловыми функциями это делать. Но раз уж они есть, то почему бы их не использовать :)
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

28 ноя 2007, 10:07

OHara писал(а):Для передачи голоса по сети .... достаточно организовать свой простенький сигнальный протокол по TCP и передачу голоса по UDP (аналог RTP).
Можно этот момент чуть уточнить? Что подразумевается под "сигнальным протоколом"?
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

28 ноя 2007, 10:31

&quot писал(а):Что подразумевается под "сигнальным протоколом"?
когда по TCP или UDP кидаются блоки определенной длинны и формата либо в сжатом либо в PCM виде. По сути звук при передаче по сети можно не сжимать, т.к. трафик очень небольшой а кидать блоком в PCM формате длиной скажем в 0.25 сек. Чем меньше блок будет кидаться по сети, тем ближе к реальному времени будет осуществлятся его прослушивание. Дело в том, что в то время как один полученный блок заканчивает играть, то второй должен быть уже получен и подготовлен для проигрывания без останова. При использовании больших буферов будет большая задержка во времени типа той, которую наблюдаем в новостях при прямой трансляции через спутник корреспондентов из других стран.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
OHara
Сообщения: 7
Зарегистрирован: 27 ноя 2007, 12:31

28 ноя 2007, 10:33

сигнальный или управляющий протокол может быть необходим для управления процессом записи голоса. В вашем случае, как Вы сами пишете, требуется иногда подключаться к каналу для прослушивания, ну, и наверняка, в процессе разработки понадобятся другие сервисные функции. Опять же для установления соединения и передачи голосового потока по RTP, необходимо передать параметры установления соединения.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

28 ноя 2007, 10:44

Можно предложить следущую схему:
1. На компе 1 работает микрофон, постоянно
2. В памяти сидит процесс, который
2.1. Пишет звук с микрофона в память с частотой дискретизации 16000Гц допустим с длиной блока в 4000 семплов (0.25 сек)
2.2. Этот блок он кидает по сетке Broadcast'ом на порт, скажем 2007 ;-)
2.3. Блок передается ACM кодеку, допустим MP3, 16000Гц, mono, 20кбит/сек и пишется в WAV файл посредством mmio чтобы эта система сама поправила WAV Header
3. Для прослушивания на компе N запускается прога которая слушает порт 2007, принимает блок в формате PCM и проигрывает его.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
OHara
Сообщения: 7
Зарегистрирован: 27 ноя 2007, 12:31

28 ноя 2007, 11:07

Так как BBB пишет, что подключаться к компу по сети будет иногда, то лучше предложенную Вами схему модернизировать:
2.В памяти сидит процесс (сервер), который
2.1. Пишет звук с микрофона сразу в файл (систему ведения файлов надо обдумать отдельно - придется нарезать их как-то)с частотой дискретизации 8000Гц моно. Для голоса этого вполне достаточно
2.2. При подключении клиента (может и нескольких) параллельно раздавать пакеты с голосом и им (опять же протокол соединения и передачи - отдельно, но тут все давно уже придумано - это RTP)
3. Для прослушивания на компе N запускается прога которая устанавливает соединение с сервером, принимает блок в формате PCM и проигрывает его.

Штроковещательное разбрасывание ИМХО не очень хорошо, да и не нужно.
8000 и моно - файл будет не очень большой, если паковать сразу в G711. Это ужмет его еще в 2 раза, а скорость работы этого кодека/декодека высока и на общий процесс не окажет существенного влияния. Кстати, архивировать звуковые файлы можно уже потом. Это уже зависит от конкретного приложения. Например, неделю хранить как есть G711, а потом фоновым процессом кодировать, да хоть просто архивировать архиватором.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

28 ноя 2007, 11:24

Я так понимаю MS G711 это аналог GSM 6.10, Этот кодек я использовал году так в 97 для копрессии песен и хочу сказать при прослушивании звук хорошо терял качество, было некое "журчание" как в MP3 при низких битрейтах. Есть еще один супер-мега-кодек DSP TrueSpeech - но все же лучше в MP3 конечно или Ogg Vorbis. Скорость кодирования/декодирования звука с такими параметрами в любом кодеке настолько высока, что даже на 486 DX-4 100 загрузка составляла около 15% при декодировании MP3 22kHz mono, что уж говорить о современных системах... параметр скорости не критичен, критичен размер файла.
It's a long way to the top if you wanna rock'n'roll
Ответить