![]() |
Работу со звуком я доделаю, у меня это был отдельный проект, только сейчас со временем плохо. Как доберусь, так объединю.
Wav файл состоит из заголовка 44 байт + данные: 52 49 46 46 xx xx xx xx 57 41 56 45 66 6D 74 20 10 00 00 00 01 00 01 00 40 1F 00 00 80 3E 00 00 02 00 10 00 64 61 74 61 yy yy yy yy .. данные .. это стандартный заголовок для наших нужд, меняться будут лишь x и y, при этом, y= размер данных в байтах, а x=y-8. Проверьте, верно ли сформирован заголовок. Или так, y=размер файла-44. |
Да Спасибо со звуком вроде справился, записывается в файл и с проигрыванием проблем нет, buf: string; string заменил на AnsiString и все заработало...
Скажите пожалуйста Autumnus, а можно ли записывать PCM данные с микрофона в порт? |
C микрофона звук идет по такому же принципу, как и через порт. В данном случае необходимо настроить микрофон на тот же формат и брать буфер равным 320 байт, при заполнении которого пересылать данные в порт. Если память не изменяет, для получения звука я использовал компонент из DelphiX. Хотя могу и наврать )
Постараюсь найти время и глянуть. ------------------------------------------------ Добавлено позже: Наврал )) Это куски кода, которые осуществляют получение звукового потока из микрофона (ну или другого выбранного устройства в микшере) WavBufLen=10; FCapture: TSoundCaptureStream; FWaveStream: TWaveStream; ShellMW.FWaveStream := TWaveFileStream.Create(ShellMW.LastFile, fmCreate); with ShellMW.FCapture.SupportedFormats[SoundFormatIndex] do ShellMW.FWaveStream.SetPCMFormat(SamplesPerSec, BitsPerSample, Channels); //здесь задаются параметры входного сигнала ShellMW.FWaveStream.Open(true); ShellMW.FCapture.BufferLength:=WavBufLen; ShellMW.FCapture.OnFilledBuffer:=ShellMW.CaptureFi lledBuffer; ShellMW.FCapture.CaptureFormat:=SoundFormatIndex; ShellMW.FCapture.Start; procedure TShellMW.CaptureFilledBuffer(Sender: TObject); var work_buffer: array [0..999] of byte; i: integer; begin Fcapture.Read(work_buffer, 200); end; процедура CaptureFilledBuffer срабатывает каждый раз при заполнении буфера наводку дал, пока много времени нет, когда напишу то выложу ;) |
duser, ну как, помогло?
|
Здравствуйте Autumnus...
Спасибо что написали! ... Да как-то со временем у меня не получилось, сегодня завтра посмотрю. И еще много вопросов возникают. :confused: 1. Прога записывает в файл без проблем (взято из Вашего кода). Вопрос: Как можно параллельно воспроизвести этот кусок RAW PCM? 2. И еще не успел проанализировать Ваш последний код (с микрофоном...) т.е. записывать PCM данные с микрофона в порт? 3. В Зависимости от условия, записывать данные в файл, в один файл, целиком и звук и данные с микрофона (т.е. тел. разговор...)??? Вот такие вопросы??? Если время будет пишите! С уважением duser... |
1. В аудиоустройство данные записываются так же - потоком. Т.е. буфер записывается в файл и этот же буфер отправляем в аудиоустройство.
2.... 3. Скорее всего данные в порту будут смешиваться. Даже не придется отдельно выводить каждый поток в аудиоустройство. В общем нужно попробовать. А если не будут - то большой проблемы тоже не вижу buf_out[i]:=buf1[i]+buf2[i]; |
Спасибо Autumnus, попробую разобраться...
|
Да никак не получается с параллельным проигрыванием... :confused::confused:
--------------------------------------------------------------------- Здравствуйте Autumnus... Вроде бы этот код должен воспроизвести RAW PCM из буфера..., или я не правильно делаю??? procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word); ... bufStream := 'RIFF WAVEfmt '+#$10+#0+#0+#0+#01+#0+#01+#0+#$40+#$1F+#0+#0+#$80 +#$3E+#0+#0+#02+#0+#$10+#0+'data '; ApdComPort1.GetBlock(buf, Count); with TMemoryStream.Create do begin try SetSize(44 + Count); Seek(0, soFromBeginning); WriteBuffer(bufStream[1], 44); Seek(44, soFromBeginning); WriteBuffer(buf, Count); Seek(4, soFromBeginning); dk:=Count-8; WriteBuffer(dk, 4); Seek(40, soFromBeginning); WriteBuffer(Count, 4); Seek(0, soFromBeginning); PlaySound(Memory, 0, SND_MEMORY or SND_SYNC); finally Free; end; end; ... end; |
http://www.delphisources.ru/pages/fa...und_again.html
http://www.delphisources.ru/pages/fa...win32_api.html можно покопаться вот тут а по поводу примера - можно проигрывать данные по 320 байт, это во-первых, а во-вторых, Memory не вижу как связаны Memory и TMemoryStream думаю, лучше всё-таки порциями через waveOutWrite звук выводить |
Здравствуйте Autumnus
На счет Memory (с помощью with)... with TMemoryStream.Create do begin PlaySound(Memory, 0, SND_MEMORY or SND_SYNC); end; или OutStream = TMemoryStream.Create; PlaySound(OutStream.Memory, 0, SND_MEMORY or SND_SYNC); ... В отдельные потоки передаю stream, что-то тормоз получается (не синхронно, с обрывами)... Да верно говорите, надо как-то по другому нужно воспроизвести. Суть ясна, проблема именно в реализации... :confused: Спасибо за ссылки... |
Тормозит из-за того, что звук идет маленькими порциями. Можно попробовать двойную буферизацию. Т.е. два массива - из одного проигрывается, а в другой пишется. Думаю здесь это лучше реализовать через потоки.
|
Здравствуйте Autumnus
Если Вам Нетрудно!, можете привести код (пример для Нашего случая, т.е. синхронно проигрывался звук с порта.......) :confused: ... Спасибо... |
Цитата:
Как успехи, что-то получилось? |
Здравствуйте Autumnus
Я уже неделю не смотрел, как-то без базовых знаний работы со звуком, не получается, да наверно здесь в большой степени и лень мешает... А Вы можете мне помочь в реализации следующей задачи?... 1. С модемом идет родная программа, там есть весь функционал (звонилка, смс и т.д. ...) 2. Пока что для звонков буду использовать родную программу, мне нужно будет просто захватить разговор и записывать в файл. 3. Когда запускается эта программа, Мы знаем что она блокирует порт HUAWEI Mobile Connect - 3G Application Interface. ВОПРОС. Можно ли параллельно получить доступ к этому порту??? (хотя наверно нет...) 4. Если невозможно получить доступ к этому порту, как записать звук с компьютера, т.е. как понимаю с микшера (звук+микрофон...)??? Вчера скачал компоненты AudioLab, там есть компонент SystemMixer. Никак не могу понять как с этим компонентом можно захватить звук и записывать в файл???... Спасибо С Уважением duser |
Здравствуйте, duser!
Подключиться к порту можно программой Advanced Serial Port Monitor. В своё время она мне здорово помогла разобраться в работе модема. Это сниффер. Можно наглядно смотреть что в порт пишется и что из него читается. Через эту программу так же хорошо видно, как идёт голосовой поток - по 320 байт туда и сюда. Удачи! |
Спасибо Autumnus!
Вы не подскажите как можно из Delphi подключится к этому порту параллельно, т.е. когда я запускаю родную программу модема, этот порт блокируется... ------------------------------------------------------- Спасибо Autumnus! Advanced Serial Port Monitor то что нужно ... Но Есть ли готовые компоненты, или пример на Delphi, открыть порт в режиме сниффера??? |
Цитата:
при записи звукового файла (8000Гц, 16бит, удалил первые 44 байта) в порт, в телефоне только слышен очень короткий шум, а в программе в memo выводится "block is empty 1". |
Цитата:
|
Проблема в том, что нужно подавать данные по счетчику. Т.е. не весь буффер целиком и за раз. А рассчитать сколько блоков в секунду. В исходнике эта проблема решена.
|
Цитата:
Меня остановила описанная выше проблема и комментарий в исходнике "но это почему-то не работает" в процедуре ApdComPort2TriggerOutbuffFree. Если исходник рабочий, попробую поискать у себя проблему. |
Текущее время: 18:17. Часовой пояс GMT +3. |
Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot