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

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

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

Возникла другая задача: играть подобный тон в линию.
Чем играть мне лично понятно:
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
Как из "memory wav" сделать wav на жестком диске?
    #38584945
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
open "c:\1.wav" for binary write as #1
...
...
Рейтинг: 0 / 0
Как из "memory wav" сделать wav на жестком диске?
    #38585011
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как из "memory wav" сделать wav на жестком диске?
    #38585035
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал секунду тишины добавить:
Код: 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
Как из "memory wav" сделать wav на жестком диске?
    #38585087
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, в принципе вот так можно:
Код: 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
Как из "memory wav" сделать wav на жестком диске?
    #38585304
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил сохранение 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
Как из "memory wav" сделать wav на жестком диске?
    #38587237
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77м.б. кому пригодится
Да плюс это:
Дмитрий77
Код: xml
1.
2.
3.
4.
<form id="PlayFile">
<audio src="test.wav"/> -проигрывает файл
<break time="4s"/> - ждет 4сек
<goto next="#PlayFile"/> -циклически возвращает к проигрыванию файла



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

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

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

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

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


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