Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как из "memory wav" сделать wav на жестком диске? / 11 сообщений из 11, страница 1 из 1
13.03.2014, 11:57
    #38584942
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Короче вот здесь вот мой пример

Генерация телефонных тонов в динамики(наушники) компьютера.

кот. генерирует телефонные тона (ожидание, занято и т.п.),
хранит их в памяти (без записи на диск) и воспроизводит.

Возникла другая задача: играть подобный тон в линию.
Чем играть мне лично понятно:
VXML
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      Dim partyA As String
      'ivrXML << "ivr:<?xml version=\"1.0\"?><vxml version=\"1.0\"><form id=\"PlayFile\">
      '<transfer bridge=\"false\" dest=\"pc:*;Auto-Answer=1\">
      '<audio src=\"" << PURL(PFilePath(command.m_param.m_playWav.m_file)) << "\"/>
      '</transfer></form></vxml>";
      partyA = "ivr:<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?><vxml version=" & _
       Chr(34) & "1.0" & Chr(34) & "><form id=" & Chr(34) & "PlayFile" & Chr(34) & _
       "><transfer bridge=" & Chr(34) & "false" & Chr(34) & " dest=" & Chr(34) & _
       "pc:*;Auto-Answer=1" & Chr(34) & "><audio src=" & Chr(34) & _
       PathForIVR(AudioFile) & _
       Chr(34) & "/></transfer></form></vxml>"


Но PathForIVR(AudioFile) -это реальный wav,
а у меня сгенерирован байтовый массив (следуя моим же старым кодам, в кот. я сунулся).
Если играть файл из памяти в динамики, то код примерно такой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Private Type DTMF
    bytTones() As Byte
End Type
Public udtDTMF As DTMF 'массив memory file

  PlayPhoneTone = snd_PlayFile(err_text, device, "", VarPtr(udtDTMF.bytTones(0)), _
   UBound(udtDTMF.bytTones) + 1, True, silence_duration, NumOfRet)

Public Function snd_PlayFile(ByRef err_text As String, ByVal device_name As String, _
...
 Optional ByVal ptr_MemoryFile As Long = 0, Optional ByVal len_MemoryFile As Long = 0, _

snd_OpenWaveFile(err_text, sSoundFile, ptr_MemoryFile, len_MemoryFile)

   ' Open the input file
   Else 'memory file
     With mmioinf
       .pIOProc = 0
       .pchBuffer = ptr_MemoryFile
       .fccIOProc = mmioStringToFOURCC("MEM", 0) 'FOURCC_MEM
       .cchBuffer = len_MemoryFile ' 32378
       '.adwInfo(0) = 1
     End With
     hMmioIn = mmioOpen(vbNullString, mmioinf, MMIO_READ) 'MMIO_CREATE MMIO_READWRITE Or MMIO_ALLOCBUF
...



Если я правильно понимаю, udtDTMF -это у меня уже готовый wav файл - со всеми заголовками.
Как его скинуть на диск с расширением wav?
Обычным методом?

Чет я туплю, как байт массив в файл записать? Кажется VB это умеет сам

И как туда "тишину" (например 2 сек) в конец дописать?.


И кстати, м.б. кто сталкивался?
VXML сама телефонные тона типа занято генерировать не умеет?
Обычные DTMF -без проблем. А вот "занято" и прочие рингтоны - чет я не нашел.

Т.е. я планирую сгенерировать wav на диск и подсунуть его в ivr(VXML) подсистему как файл.
...
Рейтинг: 0 / 0
13.03.2014, 11:59
    #38584945
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Код: vbnet
1.
2.
open "c:\1.wav" for binary write as #1
...
...
Рейтинг: 0 / 0
13.03.2014, 12:41
    #38585011
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Konst_One,

Ну да, это я сделал, файл родил.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
  Dim FileHandle As Integer         ' file handle, from freefile()
  Dim FilePos As Long               ' pointer to last byte read/written
  FileHandle = FreeFile(0)
  FilePos = 1
  Open "test.wav" For Binary Access Write Lock Write As FileHandle
  Put FileHandle, FilePos, udtDTMF.bytTones
  FilePos = FilePos + UBound(udtDTMF.bytTones) + 1
  Close FileHandle



А как туда дописать silence_duration ?

Т.е. например, длинные гудки (RU)
Код: vbnet
1.
2.
3.
4.
5.
6.
        Case PhoneTone.RingbackTone
          'Ringback (RU) 425 & 425     1.0     4.0
          fr_1 = 425
          fr_2 = 425
          play_duration = 1
          silence_duration = 4000



Гудок (1 сек) -Тишина (4 сек) - Гудок (1 сек) -Тишина (4 сек) -...
Файл записанный как выше содержит только
Гудок (1 сек)
а хорошо бы иметь (чтоб не выставлять паузы в самом vxml, а просто крутить файл по кругу)
Гудок (1 сек) -Тишина (4 сек)

Свойства memory wav (что сидит в массиве)
lngSampleRate = 8000
intBits = 8
-так понимаю число байтов в секунду этим определяется
16 044 байт -длина файла 1 сек, так понимаю 44 байта - заголовок wav

Дописать 4 сек тишины: = тупо дописать 16000*4 нулевых байт начиная с FilePos?
Или в заголовки wav придется лазить? Не помню сходу, пишется ли в заголовке wav длина.

Ну или проще в vxml скрипте паузу указать?
...
Рейтинг: 0 / 0
13.03.2014, 12:53
    #38585035
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Попробовал секунду тишины добавить:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Dim FileHandle As Integer         ' file handle, from freefile()
  Dim FilePos As Long               ' pointer to last byte read/written
  FileHandle = FreeFile(0)
  FilePos = 1
  Open "test.wav" For Binary Access Write Lock Write As FileHandle
  Put FileHandle, FilePos, udtDTMF.bytTones
  FilePos = FilePos + UBound(udtDTMF.bytTones) + 1
  Dim silence(0 To 15999) As Byte
  Put FileHandle, FilePos, silence
  FilePos = FilePos + 16000
  Close FileHandle


Размер файла честно увеличился. Но показывает в проигрывателе ту же 1 секунду, ее же гудит.
Видимо надо заголовки wav править.
Чет неохота, пойду лучше гляну что там в VXML на тему паузы есть.
...
Рейтинг: 0 / 0
13.03.2014, 13:20
    #38585087
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Ну, в принципе вот так можно:
Код: vbnet
1.
2.
3.
4.
5.
      PartyB = "ivr:<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?><vxml version=" & _
       Chr(34) & "1.0" & Chr(34) & "><form id=" & Chr(34) & "PlayFile" & Chr(34) & _
       "><audio src=" & Chr(34) & _
       PathForIVR(AudioFile) & _
       Chr(34) & "/><break time=" & Chr(34) & "4s" & Chr(34) & "/><goto next=" & Chr(34) & "#PlayFile" & Chr(34) & "/></form></vxml>"



Код: xml
1.
2.
3.
4.
<form id="PlayFile">
<audio src="test.wav"/> -проигрывает файл
<break time="4s"/> - ждет 4сек
<goto next="#PlayFile"/> -циклически возвращает к проигрыванию файла



Проверил в "системе" -слышу в тел. трубке обычные советские длинные гудки.
...
Рейтинг: 0 / 0
13.03.2014, 15:31
    #38585304
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Добавил сохранение dial-тонов в свой sound-тест-проект (без тишины), м.б. кому пригодится.

Остановился на использовании сохраненных wav-файлов.
Но на всякий случай контролирую наличие этого wav и регенерирую если вдруг кто-то удалил:

Код: vbnet
1.
2.
3.
4.
5.
        If Len(Dir(AudioFile, vbNormal)) = 0 Then
          If Len(Dir(path_AppData & "\Sounds\Tones", vbDirectory)) = 0 Then _
           MakeFolder path_AppData & "\Sounds\Tones"
          snd_SavePhoneToneAsFile RingbackTone, params.m_AppAudio.m_PhoneTones, AudioFile
        End If



Из memory конечно проще играть (и красивше, и не надо проверять существование файла), но здесь похоже не тот случай.
...
Рейтинг: 0 / 0
15.03.2014, 19:53
    #38587237
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Дмитрий77м.б. кому пригодится
Да плюс это:
Дмитрий77
Код: xml
1.
2.
3.
4.
<form id="PlayFile">
<audio src="test.wav"/> -проигрывает файл
<break time="4s"/> - ждет 4сек
<goto next="#PlayFile"/> -циклически возвращает к проигрыванию файла



которое ВЕБом пахнет, может и пригодится...
это в ВЕБе применимо? дайте пжл ссылку где Вы и для чего такое используете, спасибо
...
Рейтинг: 0 / 0
16.03.2014, 00:12
    #38587347
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
катастрофаДа плюс это:которое ВЕБом пахнет,
Это VXML, используется в IVR -системах телефонии. В простейшем варианте - проиграть wav-файл в телефонную линию. В более сложном - это когда ты звонишь в какой-нибудь билайн, а там тебе вешают лапшу: нажмите клавишу 2, клавишу 3, ждите еще 12 минут (голосовое меню).

У меня конкретно стояла задача воспроизвести длинные гудки в линию при помощи ivr (эмуляция, типичный прием в VOIP).
Программа VB генерирует файл .wav (один длинный гудок нужной тональности), а ivr -система его уже воспроизводит (циклически с нужной паузой) куда надо.

катастрофаможет и пригодится...,
пригодиться (м.б.) тебе может сохранение wav файла находящегося в памяти в wav -файл записанный на жесткий диск. Т.е. то что я к этому тесту дописал на этот раз.
...
Рейтинг: 0 / 0
16.03.2014, 08:21
    #38587391
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Дмитрий77,
> это когда ты звонишь в какой-нибудь билайн
так я и спрашиваю Вы это делаете программно? с ВЕБ страницы? или откуда?
если да, то где то можно глянуть в сети? где
...
Рейтинг: 0 / 0
17.03.2014, 00:37
    #38587722
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
катастрофатак я и спрашиваю Вы это делаете программно? или откуда? можно глянуть в сети? где
Блин (извини). Или откуда.
OpalVoiP Wiki
http://sourceforge.net/projects/opalvoip/

Интересно, разбирайся, тестовый проект называется IVR Opal. Но это сильно выходит за рамки топика, VB6 и этого форума.

Про VXML можно почитать наверно здесь .
Но я сильно пока не разбирался.
...
Рейтинг: 0 / 0
17.03.2014, 06:01
    #38587767
катастрофа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из "memory wav" сделать wav на жестком диске?
Дмитрий77, спасибо!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как из "memory wav" сделать wav на жестком диске? / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]