Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Karrde Junior member
Зарегистрирован: 16.03.2008 Сообщения: 4
|
Добавлено: Вс Мар 16, 2008 10:50 pm Заголовок сообщения: Передача голосового файла |
|
|
Каким образом, звоня с модема на телефон, передать голосовой модем. то есть у меня есть wav-файл, я передаю модему команду vtx. В каком формате посылать голосовой файл и каким образом? каждый байт, кусками по 256 байт, или сразу весь целиком? подскажите плиз |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Пн Мар 17, 2008 10:06 am Заголовок сообщения: |
|
|
Очевидно, Вы хотите передать голосовой файл (а не модем), который записан в формате WAV.
Для передачи голосовые данные из файла необходимо привести к виду (формату), на который Вы настроили модем перед выдачей #VTX. Под форматом понимается частота дискретизации (#VSR) и вид кодирования (#VBS).
Данные передаются байт за байтом с использованием процедур управления потоком (flow control), заданных командой &Kn.
Если в потоке данных встречается символ <DLE> (байт с десятичным кодом 16), то его следует продублировать (отправить <DLE><DLE>). После передачи всего файла необходимо отправить <DLE><ETX>. _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
Karrde Junior member
Зарегистрирован: 16.03.2008 Сообщения: 4
|
Добавлено: Пн Мар 17, 2008 11:04 am Заголовок сообщения: |
|
|
Код: |
//Открытие wav-файла
char FileName[MAX_PATH];
strcpy(FileName,"");
CFileDialog dlg(TRUE,NULL,NULL,OFN_ENABLESIZING|OFN_HIDEREADONLY,"wav files|*.wav|All files|*.*||");
if(dlg.DoModal()!=IDOK)
return;
strcpy(FileName,dlg.m_ofn.lpstrFile);
if(!strchr(FileName,'.'))
strcat(FileName,".wav");
ifstream file_stream;
file_stream.open(FileName, ios::binary);
if (!(file_stream.is_open()))
return;
.............................................
StringData = "AT+VTX";
pos(hCom, StringData);
StringBuf = chit(hCom);
Sleep(500);
StringData = "<DLE>";
pos(hCom, StringData);
StringBuf = chit(hCom);
Sleep(500);
//Передача голосовых данных
while( !file_stream.eof() )
{
file_stream.read(ch, 1);
StringData = ch;
pos(hCom, StringData);
}
StringData = "<DLE><ETX>";
pos(hCom, StringData);
StringBuf = chit(hCom);
//команда повесить трубку
StringData = "ATH";
pos(hCom, StringData);
StringBuf = chit(hCom);
Sleep(1000); |
ну вот я посылаю таким образом. Открываю wav-файл. Сначала отправляю модему команду +VTX, потом, насколько я понял, нужно отправить символ <DTE>, и после это пишу побайтно содержимое файла. Но в итоге вместо звука слышен треск |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Пн Мар 17, 2008 11:32 am Заголовок сообщения: |
|
|
Создаётся впечатление, что мы с Вами разговариваем на разных языках
Символ <DLE> надо удваивать, если он встретился в потоке голосовых данных. Посылать перед потоком его не нужно.
"Треск" при воспроизведении обычно связан с несовпадением формата голосовых данных или с недостаточным быстродействием программы (data underrun). Что это в Вашем случае - не знаем; для разпознания ошибочной ситуации нужно, как минимум, увидеть сообщения модема в ответ на команды и о событиях, возникающих во время воспроизведения голоса. Ваша же программа этого делать не умеет, даже разбора ответов модема нет! Вы пользуетесь задержкой, чтобы дать модему время на выполнение команды, а не ждёте ответ модема, подтверждающий выполнение.
Ну и "по мелочам". <DLE> - символ с десятичным кодом 16, а не строка из 5 символов. Аналогично и <ETX> - символ с кодом 3.
Судя по всему, Вам не стоит писать программу с нуля. Воспользуйтесь IDC Ventafax (там есть командный режим, позволяющий запустить программу и передать ей файл для воспроизведения в командной строке), либо используйте Voice Modem Library, если непременно хотите написать свою программу. _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
Karrde Junior member
Зарегистрирован: 16.03.2008 Сообщения: 4
|
Добавлено: Вт Мар 18, 2008 3:13 pm Заголовок сообщения: |
|
|
Да, похоже мы друг друга плохо понимаем Вопрос состоит в том, в какой формат нужно конвертировать wav-файл(и нужно ли вообще), и как его посылать(засылать по одному байту, или блоками)? |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Вт Мар 18, 2008 11:27 pm Заголовок сообщения: |
|
|
Модем ничего не знает о формате WAV-файла (в частности, о его заголовке). Модему нужны "сырые" голосовые данные; способ кодирования этих данных задаётся параметрами команд #VSR и #VBS. Например, если задать:
at #vsr=7200 #vbs=8
то данные нужно будет поставлять в виде 8-бит PCM, с частотой дискретизации 7200 Гц.
Для преобразования формата файлов можно воспользоваться, например, Windows ACM (Audio Compression Manager).
Если не требуется преобразовывать файл "на лету", то можно подготовить его в нужном формате заранее. Для этого загружаете WAV в какой-нибудь музредактор (например, CoolEdit) и сохраняете его в формате RAW, с нужной частотой дискретизации.
Передача данных в модем выполняется непрерывным потоком, никаких задержек после передачи 256 или другого количества байт не требуется. Для регулировки скорости передачи используется управление потоком данных (XON/XOFF или CTS, в зависимости от параметра команды &K). При передаче данных необходимо удваивать <DLE>, как мы писали выше. После передачи всех данных необходимо послать модему <DLE> <ETX>, чтобы он вернулся в командный режим. _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
Karrde Junior member
Зарегистрирован: 16.03.2008 Сообщения: 4
|
Добавлено: Пн Мар 24, 2008 6:26 pm Заголовок сообщения: |
|
|
Спасибо большое, вроде получилось правда в итоге конвертировал файл не в формат raw, а в формат pcm 8кГц, 8 бит. Только с таким форматом выводит. И ещё, если не сложно, вопрос. При выводе звука, в телефонной линии на фоне проигрываемого голосового файла, все время слышится треск. из-за чего он возникает, из-за каких погрешностей. |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Вт Мар 25, 2008 12:17 am Заголовок сообщения: |
|
|
Формат может называться по разному, но суть одна: нужны "сырые" голосовые данные. Название "8-bit PCM" правильно отражает суть дела
Что касается треска, то это может быть как "естественный шум" телефонного соединения, так и результат проблем при воспроизведении файла. Наиболее типичные: программа не успевает поставлять голосовые данные (data underrun) и отсутствие обработки управления потоком (data overrun). Модем умеет сообщать о таких проблемах с помощью DLE-кодов, но Ваша программа не способна эти коды принять и о них сообщить. Вслепую выяснить причину сложно... разве что можем посоветовать проверить время воспроизведения файла. Если минутный файл воспроизводится, скажем, в течении 70 сек, то явно происходит data underrun. _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
sega1979 Junior member
Зарегистрирован: 10.07.2008 Сообщения: 1
|
Добавлено: Чт Июл 10, 2008 8:44 am Заголовок сообщения: |
|
|
Technical Support писал(а): |
Что касается треска, то это может быть как "естественный шум" телефонного соединения, так и результат проблем при воспроизведении файла. Наиболее типичные: программа не успевает поставлять голосовые данные (data underrun) и отсутствие обработки управления потоком (data overrun). Модем умеет сообщать о таких проблемах с помощью DLE-кодов, но Ваша программа не способна эти коды принять и о них сообщить. Вслепую выяснить причину сложно... разве что можем посоветовать проверить время воспроизведения файла. Если минутный файл воспроизводится, скажем, в течении 70 сек, то явно происходит data underrun. |
Технически более мение понятно, но как с этим бороться, что можно сделать, чтоб треск прекратился? |
|
Вернуться к началу |
|
|
Technical Support Expert
Зарегистрирован: 31.10.2002 Сообщения: 6330
|
Добавлено: Чт Июл 10, 2008 12:55 pm Заголовок сообщения: |
|
|
Чтобы бороться, нужно знать, из-за чего треск возникает. Вы получаете сообщения о data underrun (<DLE>u) ? _________________ Inpro
Technical Support |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|