©2002, INPRO Development Corporation
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход

Передача голосового файла

 
Начать новую тему   Ответить на тему    Список форумов Форум по модемам IDC -> General
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
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    Заголовок сообщения: Ответить с цитатой

Создаётся впечатление, что мы с Вами разговариваем на разных языках Sad

Символ <DLE> надо удваивать, если он встретился в потоке голосовых данных. Посылать перед потоком его не нужно.

"Треск" при воспроизведении обычно связан с несовпадением формата голосовых данных или с недостаточным быстродействием программы (data underrun). Что это в Вашем случае - не знаем; для разпознания ошибочной ситуации нужно, как минимум, увидеть сообщения модема в ответ на команды и о событиях, возникающих во время воспроизведения голоса. Ваша же программа этого делать не умеет, даже разбора ответов модема нет! Sad Вы пользуетесь задержкой, чтобы дать модему время на выполнение команды, а не ждёте ответ модема, подтверждающий выполнение.

Ну и "по мелочам". <DLE> - символ с десятичным кодом 16, а не строка из 5 символов. Аналогично и <ETX> - символ с кодом 3.

Судя по всему, Вам не стоит писать программу с нуля. Воспользуйтесь IDC Ventafax (там есть командный режим, позволяющий запустить программу и передать ей файл для воспроизведения в командной строке), либо используйте Voice Modem Library, если непременно хотите написать свою программу.
_________________
Inpro
Technical Support
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Karrde
Junior member


Зарегистрирован: 16.03.2008
Сообщения: 4

СообщениеДобавлено: Вт Мар 18, 2008 3:13 pm    Заголовок сообщения: Ответить с цитатой

Да, похоже мы друг друга плохо понимаемSad Вопрос состоит в том, в какой формат нужно конвертировать 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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Karrde
Junior member


Зарегистрирован: 16.03.2008
Сообщения: 4

СообщениеДобавлено: Пн Мар 24, 2008 6:26 pm    Заголовок сообщения: Ответить с цитатой

Спасибо большое, вроде получилосьSmile правда в итоге конвертировал файл не в формат raw, а в формат pcm 8кГц, 8 бит. Только с таким форматом выводит. И ещё, если не сложно, вопрос. При выводе звука, в телефонной линии на фоне проигрываемого голосового файла, все время слышится треск. из-за чего он возникает, из-за каких погрешностей.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Technical Support
Expert


Зарегистрирован: 31.10.2002
Сообщения: 6330

СообщениеДобавлено: Вт Мар 25, 2008 12:17 am    Заголовок сообщения: Ответить с цитатой

Формат может называться по разному, но суть одна: нужны "сырые" голосовые данные. Название "8-bit PCM" правильно отражает суть дела Smile

Что касается треска, то это может быть как "естественный шум" телефонного соединения, так и результат проблем при воспроизведении файла. Наиболее типичные: программа не успевает поставлять голосовые данные (data underrun) и отсутствие обработки управления потоком (data overrun). Модем умеет сообщать о таких проблемах с помощью DLE-кодов, но Ваша программа не способна эти коды принять и о них сообщить. Вслепую выяснить причину сложно... разве что можем посоветовать проверить время воспроизведения файла. Если минутный файл воспроизводится, скажем, в течении 70 сек, то явно происходит data underrun.
_________________
Inpro
Technical Support
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
sega1979
Junior member


Зарегистрирован: 10.07.2008
Сообщения: 1

СообщениеДобавлено: Чт Июл 10, 2008 8:44 am    Заголовок сообщения: Ответить с цитатой

Technical Support писал(а):

Что касается треска, то это может быть как "естественный шум" телефонного соединения, так и результат проблем при воспроизведении файла. Наиболее типичные: программа не успевает поставлять голосовые данные (data underrun) и отсутствие обработки управления потоком (data overrun). Модем умеет сообщать о таких проблемах с помощью DLE-кодов, но Ваша программа не способна эти коды принять и о них сообщить. Вслепую выяснить причину сложно... разве что можем посоветовать проверить время воспроизведения файла. Если минутный файл воспроизводится, скажем, в течении 70 сек, то явно происходит data underrun.


Технически более мение понятно, но как с этим бороться, что можно сделать, чтоб треск прекратился?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Technical Support
Expert


Зарегистрирован: 31.10.2002
Сообщения: 6330

СообщениеДобавлено: Чт Июл 10, 2008 12:55 pm    Заголовок сообщения: Ответить с цитатой

Чтобы бороться, нужно знать, из-за чего треск возникает. Вы получаете сообщения о data underrun (<DLE>u) ?
_________________
Inpro
Technical Support
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум по модемам IDC -> General Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group

Created this page in 0.020178 seconds : 16 queries executed : GZIP compression enabled : Debug Mode

©2002, INPRO Development Corporation

Rambler's Top100