GSM Форум - GSMForum.SU

GSM Форум - GSMForum.SU (https://gsmforum.su/index.php)
-   Мобильные модемы для сотовых сетей. 3G/GPRS/EDGE/GSM/HSCSD (https://gsmforum.su/forumdisplay.php?f=284)
-   -   Получение голоса с Huawei E1550 сторонними программами (https://gsmforum.su/showthread.php?t=70306)

Autumnus 13.03.2012 16:59

Работу со звуком я доделаю, у меня это был отдельный проект, только сейчас со временем плохо. Как доберусь, так объединю.

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.

duser 13.03.2012 17:19

Да Спасибо со звуком вроде справился, записывается в файл и с проигрыванием проблем нет, buf: string; string заменил на AnsiString и все заработало...

Скажите пожалуйста Autumnus, а можно ли записывать PCM данные с микрофона в порт?

Autumnus 13.03.2012 18:44

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 срабатывает каждый раз при заполнении буфера

наводку дал, пока много времени нет, когда напишу то выложу ;)

Autumnus 15.03.2012 22:04

duser, ну как, помогло?

duser 16.03.2012 12:25

Здравствуйте Autumnus...

Спасибо что написали!

... Да как-то со временем у меня не получилось, сегодня завтра посмотрю. И еще много вопросов возникают. :confused:

1. Прога записывает в файл без проблем (взято из Вашего кода).
Вопрос: Как можно параллельно воспроизвести этот кусок RAW PCM?

2. И еще не успел проанализировать Ваш последний код (с микрофоном...) т.е. записывать PCM данные с микрофона в порт?

3. В Зависимости от условия, записывать данные в файл, в один файл, целиком и звук и данные с микрофона (т.е. тел. разговор...)???

Вот такие вопросы??? Если время будет пишите!

С уважением duser...

Autumnus 16.03.2012 13:05

1. В аудиоустройство данные записываются так же - потоком. Т.е. буфер записывается в файл и этот же буфер отправляем в аудиоустройство.
2....
3. Скорее всего данные в порту будут смешиваться. Даже не придется отдельно выводить каждый поток в аудиоустройство. В общем нужно попробовать. А если не будут - то большой проблемы тоже не вижу buf_out[i]:=buf1[i]+buf2[i];

duser 16.03.2012 16:10

Спасибо Autumnus, попробую разобраться...

duser 17.03.2012 11:40

Да никак не получается с параллельным проигрыванием... :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;

Autumnus 18.03.2012 09:03

http://www.delphisources.ru/pages/fa...und_again.html
http://www.delphisources.ru/pages/fa...win32_api.html
можно покопаться вот тут
а по поводу примера - можно проигрывать данные по 320 байт, это во-первых, а во-вторых, Memory не вижу как связаны Memory и TMemoryStream

думаю, лучше всё-таки порциями через waveOutWrite звук выводить

duser 18.03.2012 09:30

Здравствуйте 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 18.03.2012 20:26

Тормозит из-за того, что звук идет маленькими порциями. Можно попробовать двойную буферизацию. Т.е. два массива - из одного проигрывается, а в другой пишется. Думаю здесь это лучше реализовать через потоки.

duser 19.03.2012 10:12

Здравствуйте Autumnus

Если Вам Нетрудно!, можете привести код (пример для Нашего случая, т.е. синхронно проигрывался звук с порта.......)

:confused:

...
Спасибо...

Autumnus 29.03.2012 17:18

Цитата:

Сообщение от duser (Сообщение 421112)
Здравствуйте Autumnus

Если Вам Нетрудно!, можете привести код (пример для Нашего случая, т.е. синхронно проигрывался звук с порта.......)

:confused:

...
Спасибо...

Пока сам еще этим не занимался.

Как успехи, что-то получилось?

duser 30.03.2012 09:32

Здравствуйте Autumnus

Я уже неделю не смотрел, как-то без базовых знаний работы со звуком, не получается, да наверно здесь в большой степени и лень мешает...

А Вы можете мне помочь в реализации следующей задачи?...

1. С модемом идет родная программа, там есть весь функционал (звонилка, смс и т.д. ...)

2. Пока что для звонков буду использовать родную программу, мне нужно будет просто захватить разговор и записывать в файл.

3. Когда запускается эта программа, Мы знаем что она блокирует порт HUAWEI Mobile Connect - 3G Application Interface. ВОПРОС. Можно ли параллельно получить доступ к этому порту??? (хотя наверно нет...)

4. Если невозможно получить доступ к этому порту, как записать звук с компьютера, т.е. как понимаю с микшера (звук+микрофон...)???
Вчера скачал компоненты AudioLab, там есть компонент SystemMixer. Никак не могу понять как с этим компонентом можно захватить звук и записывать в файл???...

Спасибо
С Уважением duser

Autumnus 30.03.2012 09:44

Здравствуйте, duser!
Подключиться к порту можно программой Advanced Serial Port Monitor. В своё время она мне здорово помогла разобраться в работе модема. Это сниффер. Можно наглядно смотреть что в порт пишется и что из него читается. Через эту программу так же хорошо видно, как идёт голосовой поток - по 320 байт туда и сюда.

Удачи!

duser 30.03.2012 09:49

Спасибо Autumnus!
Вы не подскажите как можно из Delphi подключится к этому порту параллельно, т.е. когда я запускаю родную программу модема, этот порт блокируется...
-------------------------------------------------------
Спасибо Autumnus!
Advanced Serial Port Monitor то что нужно ... Но
Есть ли готовые компоненты, или пример на Delphi, открыть порт в режиме сниффера???

g_grey 25.04.2012 00:40

Цитата:

Сообщение от Autumnus (Сообщение 420131)
гетзилла.нэт
files/3068525/gsm.rar.html
реализовано проигрывание звука из файла в аудиопорт и запись аудио из порта в wav файл. снабдил исходник некоторыми комментариями и добавил отсылку и получение смс. будут вопросы отвечу.
Код писался в Delphi 5 с компонентом ApdComPort из AsyncPro 4.07.

Пожалуйста, помогите со следующим вопросом по данной программе:
при записи звукового файла (8000Гц, 16бит, удалил первые 44 байта) в порт, в телефоне только слышен очень короткий шум, а в программе в memo выводится "block is empty 1".

g_grey 28.04.2012 00:10

Цитата:

Сообщение от Autumnus (Сообщение 420131)
гетзилла.нэт
files/3068525/gsm.rar.html
реализовано проигрывание звука из файла в аудиопорт и запись аудио из порта в wav файл. снабдил исходник некоторыми комментариями и добавил отсылку и получение смс. будут вопросы отвечу.
Код писался в Delphi 5 с компонентом ApdComPort из AsyncPro 4.07.

Получилось у кого-то проигрывание звука в аудиопорт?

Autumnus 06.05.2012 16:11

Проблема в том, что нужно подавать данные по счетчику. Т.е. не весь буффер целиком и за раз. А рассчитать сколько блоков в секунду. В исходнике эта проблема решена.

g_grey 06.05.2012 20:07

Цитата:

Сообщение от Autumnus (Сообщение 426315)
Проблема в том, что нужно подавать данные по счетчику. Т.е. не весь буффер целиком и за раз. А рассчитать сколько блоков в секунду. В исходнике эта проблема решена.

За исходники огромное спасибо!
Меня остановила описанная выше проблема и комментарий в исходнике "но это почему-то не работает" в процедуре ApdComPort2TriggerOutbuffFree.
Если исходник рабочий, попробую поискать у себя проблему.


Текущее время: 18:17. Часовой пояс GMT +3.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot