Вверх ↑
Этот топик читают: Гость
Ответов: 195
Рейтинг: 5
#1: 2019-08-19 18:22:53 ЛС | профиль | цитата
Добрый день прошу вас помочь, есть необходимость сделать простенькую программку которая будет захватывать микрофон и аудио поток слать на сайт. Пожалуйста помогите.
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8886
Рейтинг: 823
#2: 2019-08-19 23:02:04 ЛС | профиль | цитата
hin4, в примерах на вашем компьютере по пути "%%\hiasm*\Elements\Delphi\Example\Media\BASS" есть.
Пример


Add(ChildPanelEx,15569021,196,70)
{
@Hint=#39:Запуск BASS 2.4 и выбор источника звука|
link(Handle,14765800:Handle,[(202,61)(188,61)(188,96)(153,96)])
}
BEGIN_SDK
Add(EditMultiEx,6822816,21,21)
{
WorkCount=#21:doStart=Начать работу|
EventCount=#21:onStart=Начать работу|
DataCount=#46:Handle=Идентификатор основного окна приложения|
Width=517
Height=172
VOffset=35
HOffset=42
link(doStart,15175716:doEvent1,[])
}
Add(Panel,3900892,175,42)
{
Top=-5
Width=378
Height=260
Visible=1
Caption=" Выбрать источник звука"
Alignment=2
Point(doVisible)
}
Add(BASS_Version,10183901,126,91)
{
link(onCheckOk,2139448:doEnum,[])
link(onCheckFailed,109118:doMessage,[(166,104)(166,146)])
}
Add(Message,11232751,126,140)
{
Message="Error BASS initialization"
Caption="Error"
Icon=1
}
Add(Message,109118,175,140)
{
Message="Incorrect version of BASS library "
Caption="Error"
Icon=1
}
Add(BASS_Init,4252681,77,91)
{
Freq=22050
Flags=3
link(onInit,10183901:doCheck,[])
link(onError,11232751:doMessage,[(117,104)(117,146)])
link(Handle,6822816:Handle,[(97,56)(69,56)])
}
Add(BASS_RecordCenter,12302345,273,98)
{
link(onInit,15862958:doEnumInputs,[])
link(onError,11713735:doMessage,[(310,111)(310,153)])
}
Add(Message,11713735,322,147)
{
Message="InitRecord failed!"
Caption="Error"
Icon=1
}
Add(BASS_RecordInput,15862958,322,98)
{
link(onEnumInputs,16487182:doEvent1,[])
}
Add(BASS_InputControl,9998094,448,98)
{
Volume=1
State=1
link(onSetInput,9127027:doEvent1,[])
link(Volume,10061734:Var1,[(461,83)])
link(State,10061734:Var2,[])
}
Add(Memory,4613851,462,35)
{
Default=Integer(1)
}
Add(ComboBox,4718633,224,91)
{
Left=5
Top=5
Width=185
Height=21
link(onClick,12302345:doInit,[])
}
Add(GetDataEx,10061734,462,78)
{
link(Data,4613851:Value,[])
}
Add(ChanelToIndex,14252892,126,49)
{
link(onIndex,3900892:doVisible,[])
}
Add(Hub,15175716,49,56)
{
link(onEvent1,14252892:doWork2,[])
link(onEvent2,4252681:doInit,[(66,69)(66,97)])
}
Add(ComboBox,8950199,399,105)
{
Left=195
Top=5
Width=175
Height=21
Enabled=1
Point(doEnabled)
link(onClick,9998094:doSetInput,[(439,118)(439,104)])
}
Add(BASS_RecordDevices,2139448,175,91)
{
link(onEnum,4718633:doAdd,[])
}
Add(Hub,16487182,364,98)
{
link(onEvent1,8950199:doEnabled,[(388,104)(388,153)])
link(onEvent2,8950199:doAdd,[])
}
Add(Hub,9127027,490,98)
{
link(onEvent1,14252892:doWork1,[(512,104)(512,31)(114,31)(114,55)])
link(onEvent2,6822816:onStart,[(522,111)(522,62)])
}
END_SDK
Add(MainForm,14765800,147,56)
{
Width=393
Height=295
Caption="Звук"
Point(onClose)
Point(Handle)
link(onCreate,15569021:doStart,[])
}
Add(BASS_RecordStart,930540,203,126)
{
Freq=22050
Mode=1
Name="MySound"
link(onData,1578070:Method,[])
}
Add(Button,14423340,147,112)
{
Left=25
Top=10
Caption="Пуск"
link(onClick,930540:doStart,[(193,118)(193,132)])
}
Add(Button,7390731,147,147)
{
Left=25
Top=45
Caption="Стоп"
link(onClick,930540:doStop,[(186,153)(186,139)])
}
Add(PaintBox,8758719,294,70)
{
Left=10
Top=70
Width=360
Height=180
link(onBeforeDraw,5631139:doDraw,[])
}
Add(BASS_ChannelVisibleSpectrum,5631139,350,70)
{
SoundStream="MySound"
Mode=1
link(WindowsHandle,8758719:Bitmap,[(356,58)(328,58)(328,114)(300,114)])
}
Add(Timer,5820169,245,70)
{
Interval=10
link(onTimer,8758719:doRefresh,[])
}
Add(PointHint,1578070,252,123)
{
Info=#55:Из этой точки 10 раз в секунду выдаётся звуковой поток.|
HAlign=0
Width=302
}

карма: 19

0
Ответов: 195
Рейтинг: 5
#3: 2019-08-19 23:30:22 ЛС | профиль | цитата
Спасибо огромное за пример, а как правильно настроить теперь сервер чтобы транслировать по ссылке http://102.175.56.174:89/MySound.mp3
карма: 0

0
Ответов: 4612
Рейтинг: 746
#4: 2019-08-20 10:46:55 ЛС | профиль | цитата
А в mp3 ещё надо закодировать...
карма: 26

0
Ответов: 195
Рейтинг: 5
#5: 2019-08-20 11:20:19 ЛС | профиль | цитата
я нашел вот такую статейку, [url ] https://www.opennet.ru/base/sys/radio_protocols.txt.html [/url] показывается как по протоколу HTTP слать делать слать аудио поток. И еще вот есть HLS протокол [url http://www.s-pro.tv/upload/iblock/HLS.pdf]HLS[/url] К сожалению у меня не получается слать это все добро как нужно(

Редактировалось 5 раз(а), последний 2019-08-20 11:56:17
карма: 0

0
Ответов: 2059
Рейтинг: 131
#6: 2019-08-20 12:56:44 ЛС | профиль | цитата
hin4, Вот попробуй чего-нибудь отсюда посмотреть.
Года 2-3 назад я чего-то делал - остался довольным.
https://yadi.sk/d/iOxlAzxloqNfFw
Сеть, мультимедийная библиотека работает над TCP.
1) Доступ к экрану удаленного компьютера (см демки в РЦ вас).
2) Голос вещания (см голосового вещания демо).
3) Голосовой чат (см VoiceP2PChat и софтфон демки).
карма: 6

0
Ответов: 195
Рейтинг: 5
#7: 2019-08-20 16:03:20 ЛС | профиль | цитата
этот вариант хорош спасибо, но мне нужно чтобы создавалась ссылка что то типа (http://102.175.56.174:89/MySound.mp3) и поток слался на сайта в <audio></audio>

я пробовал создавать аудио файл WAV и каждые 2 секунды его перезаписывать и создал HTTP server но ничего не работает.

--- Добавлено в 2019-08-20 16:09:22

заработало но прямого потока нет вот сам код что у меня получилось
то есть слушать можно но только после того как файл создастся. нужно чтобы в реал тайм был звук
Add(ChildPanelEx,15569021,112,70)
{
@Hint=#39:Запуск BASS 2.4 и выбор источника звука|
link(Handle,14765800:Handle,[(118,61)(104,61)(104,96)(69,96)])
}
BEGIN_SDK
Add(EditMultiEx,6822816,21,21)
{
WorkCount=#21:doStart=Начать работу|
EventCount=#21:onStart=Начать работу|
DataCount=#46:Handle=Идентификатор основного окна приложения|
Width=692
Height=242
VOffset=35
HOffset=42
link(doStart,15175716:doEvent1,[(53,62)(53,132)])
}
Add(Panel,3900892,266,112)
{
Left=15
Width=385
Height=26
Visible=1
Caption=" Выбрать источник звука"
Alignment=2
Point(doVisible)
}
Add(BASS_Version,10183901,161,161)
{
link(onCheckOk,2139448:doEnum,[])
link(onCheckFailed,109118:doMessage,[(201,174)(201,216)])
}
Add(Message,11232751,161,210)
{
Message="Error BASS initialization"
Caption="Error"
Icon=1
}
Add(Message,109118,210,210)
{
Message="Incorrect version of BASS library "
Caption="Error"
Icon=1
}
Add(BASS_Init,4252681,112,161)
{
Freq=22050
Flags=3
link(onInit,10183901:doCheck,[])
link(onError,11232751:doMessage,[(152,174)(152,216)])
link(Handle,6822816:Handle,[(132,126)(104,126)])
}
Add(BASS_RecordCenter,12302345,308,168)
{
link(onInit,15862958:doEnumInputs,[])
link(onError,11713735:doMessage,[(345,181)(345,223)])
}
Add(Message,11713735,378,217)
{
Message="InitRecord failed!"
Caption="Error"
Icon=1
}
Add(BASS_RecordInput,15862958,357,168)
{
link(onEnumInputs,16487182:doEvent1,[])
}
Add(BASS_InputControl,9998094,497,168)
{
Volume=1
State=1
link(onSetInput,9127027:doEvent1,[])
link(Volume,10061734:Var1,[(510,153)])
link(State,10061734:Var2,[])
}
Add(Memory,4613851,511,105)
{
Default=Integer(1)
}
Add(ComboBox,4718633,259,161)
{
Left=5
Top=5
Width=185
Height=21
link(onClick,12302345:doInit,[])
}
Add(GetDataEx,10061734,511,148)
{
link(Data,4613851:Value,[])
}
Add(ChanelToIndex,14252892,161,119)
{
link(onIndex,3900892:doVisible,[])
}
Add(Hub,15175716,84,126)
{
link(onEvent1,14252892:doWork2,[])
link(onEvent2,4252681:doInit,[(101,139)(101,167)])
}
Add(ComboBox,8950199,441,161)
{
Left=195
Top=5
Width=175
Height=21
Enabled=1
Point(doEnabled)
link(onClick,9998094:doSetInput,[])
}
Add(BASS_RecordDevices,2139448,210,161)
{
link(onEnum,4718633:doAdd,[])
}
Add(Hub,16487182,399,168)
{
link(onEvent1,8950199:doEnabled,[(423,174)(423,195)])
link(onEvent2,8950199:doAdd,[(427,181)(427,167)])
}
Add(Hub,9127027,567,168)
{
link(onEvent1,14252892:doWork1,[(593,174)(593,150)(149,150)(149,125)])
link(onEvent2,6822816:onStart,[(595,181)(595,62)])
}
END_SDK
Add(MainForm,14765800,63,56)
{
Width=455
Height=380
Caption="Звук"
Point(onClose)
Point(Handle)
link(onCreate,15569021:doStart,[])
}
Add(BASS_RecordStart,930540,301,287)
{
Freq=22050
Name="MySound"
link(FileName,7034552:Var1,[(307,152)])
}
Add(Button,14423340,154,161)
{
Left=45
Top=35
Caption="Пуск"
link(onClick,8914287:doEvent1,[])
}
Add(Button,7390731,98,287)
{
Left=125
Top=40
Caption="Стоп"
link(onClick,10975849:doEvent1,[])
}
Add(PaintBox,8758719,210,70)
{
Left=10
Top=70
Width=360
Height=180
link(onBeforeDraw,5631139:doDraw,[])
}
Add(BASS_ChannelVisibleSpectrum,5631139,266,70)
{
SoundStream="MySound"
link(WindowsHandle,8758719:Bitmap,[(272,58)(244,58)(244,114)(216,114)])
}
Add(Timer,5820169,161,70)
{
Interval=10
link(onTimer,8758719:doRefresh,[])
}
Add(Hub,8914287,315,161)
{
OutCount=5
link(onEvent1,1507986:doString,[(445,167)(445,223)])
link(onEvent2,6145327:doString,[(427,174)(427,111)])
link(onEvent5,930540:doStart,[(341,195)(341,244)(289,244)(289,293)])
}
Add(HTTPServer,8589034,525,294)
{
Port="900"
link(Path,1507986:FString,[])
}
Add(Dir,9567969,525,49)
{
}
Add(FormatStr,6145327,525,105)
{
Mask="%1server\www\default.wav"
Point(FString)
link(Str1,9567969:CurrentDir,[])
}
Add(GetDataEx,329078,525,140)
{
link(Data,6145327:FString,[])
}
Add(GetDataEx,7034552,525,147)
{
link(Data,329078:Var2,[])
}
Add(Hub,10975849,182,287)
{
OutCount=3
link(onEvent3,930540:doStop,[(248,307)(248,300)])
}
Add(Dir,16773686,525,168)
{
}
Add(FormatStr,1507986,525,217)
{
Mask="%1server\www\"
Point(FString)
link(onFString,8589034:doCreate,[(569,223)(569,261)(513,261)(513,300)])
link(Str1,16773686:CurrentDir,[])
}



Редактировалось 2 раз(а), последний 2019-08-20 16:11:17
карма: 0

0
Ответов: 2059
Рейтинг: 131
#8: 2019-08-20 20:04:52 ЛС | профиль | цитата
hin4, никак въехать не могу.
То
мне нужно чтобы создавалась ссылка что то типа (http://102.175.56.174:89/MySound.mp3)

Это файл.
а то
и поток слался на сайта в <audio></audio>

заработало но прямого потока нет

нужно чтобы в реал тайм был звук

Это поток.
Разницу улавливаешь?
Если mp3 то https://yadi.sk/d/M3cYoFffyX6B1w
Вот пример нарезания бесконечного радиопотока на файлы mp3 - рассказы. (зелёная кнопка запись, разберёшься.)
https://yadi.sk/d/xrLS6MGnFFMyZg
Или тебе нужно передавать потоковый звук?
Если меня не подводят мои телепатические способности, то именно это тебе и нужно.
Этим компонентом hiSoundBuffer создаётся бесконечный звуковой поток, если надо его сжимать, как mp3, то нужно взять MP3Encode.pas, lame_enc.pas из компонента Lame-ENC и писать не в файл, а в поток, который надо передавать. В поток каждый раз пишется EncodeChunk, когда он заполнится.
В библиотеке, ссылку на которую я дал ранее, всё уже сделано вместе с передачей по сети.
Но тогда почему ты пишешь?
этот вариант хорош спасибо, но мне нужно чтобы создавалась ссылка что то типа (http://102.175.56.174:89/MySound.mp3)

Похоже, что ты не понимаешь, как всё работает, по этому и вопроса не можешь внятно сформулировать.
Надо не просто почитать по этой теме, а понимать до такой степени, чтобы мог-бы объяснить всё на пальцах. Надо представлять, что происходит на пути от микрофона до динамика на другом конце сети.
Это касается любой темы за которую берёшься.

Редактировалось 2 раз(а), последний 2019-08-20 20:14:01
карма: 6

0
Ответов: 4612
Рейтинг: 746
#9: 2019-08-21 10:44:46 ЛС | профиль | цитата
flint2 писал(а):
Это файл.
Нет. Это - URL-адрес ресурса на сервере. В данном случае - mp3-потока. А как он хранится на сервере - в файле, или генерируется "на лету" - клиенту не важно. Как я понимаю, есть какие-то соглашения по поводу потокового mp3-аудио через HTTP, чтобы плеер по одному и тому же адресу http://102.175.56.174:89/MySound.mp3 беспрерывно получал последовательно файлы mp3 со своими тегами (исполнитель, название и т.п.) и продолжительностью (а не "бесконечный поток" типа 99:99:59).

Редактировалось 2 раз(а), последний 2019-08-21 10:45:43
карма: 26

0
Ответов: 195
Рейтинг: 5
#10: 2019-08-21 11:01:41 ЛС | профиль | цитата
Да, Согласен взялся за тему в которой я полный ноль, единственное что получилось сделать так это то что можно воспроизводить файл в барузере после завершения записи, это уже для меня прогресс)) дальше осталось разобраться, как сделать сервер который будет создавать аудио поток сразу в интернет и чтобы его можно было его же воспроизводить подключившись по ссылки к этому потоку в браузере. (если я например что-то скажув микрофон)Микрофон ==> (слушает микрофон) Сервер (создает аудио стрим) ==> Создает аудио поток ==>клиент (слушатель на том конце, через браузер или со смартфона(PWA) с задержкой там в 1-3 секунды услышал что я сказал)

время аудио стрима или скажем моего разговора может длиться там 2-3 часа и в это время все кто зашли например на сайт могут слушать то что я говорю сейчас в общем как радио которое я вещаю а меня слушают.

--- Добавлено в 2019-08-21 11:10:09

BroadWave эта программка делает то что нужно но только я хочу чтобы для моего сайта была программа "моя" в том смысле чтобы добавить нужные мне функции дополнительно а основная задача это "Прямая трансляция аудио через Интернет"

Редактировалось 1 раз(а), последний 2019-08-21 11:10:09
карма: 0

0
Ответов: 8886
Рейтинг: 823
#11: 2019-08-21 11:59:54 ЛС | профиль | цитата
hin4 писал(а):
..взялся за тему в которой я полный ноль..
В этом случае надо искать ГОТОВЫЕ программы, тем более что
hin4 писал(а):
все кто зашли например на сайт могут слушать то что я говорю сейчас
Что подразумевает использование стандартизированных протоколов, а не самодельных программулек, на ходу изменяемых.
hin4 писал(а):
я нашел вот такую статейку, "https://www.opennet.ru..." показывается как по протоколу HTTP ... слать аудио поток. И еще вот есть HLS протокол "http://www.s-pro.tv/upload..." К сожалению у меня не получается
И не получится без серьёзного изучения протоколов и ясного понимания задачи, что требует ТРУДА и не малого
карма: 19

0
Ответов: 2059
Рейтинг: 131
#12: 2019-08-21 12:20:59 ЛС | профиль | цитата
Netspirit писал(а):
Нет. Это - URL-адрес ресурса на сервере. В данном случае - mp3-потока. А как он хранится на сервере - в файле, или генерируется "на лету" - клиенту не важно.

Я хочу донести такую мысль: Поток - это процесс. Файл и стрим - это тара для хранения информации.
Поток можно создавать из одного файла mp3, ogg, wav,..., или множества - паровозом, или данных со звуковой карты. Звуковая карта может не издавать ни звука, но поток всё равно будет существовать. Поток может быть организован в любом формате (FLAC, MP3, WAV и даже RIF). Лишь-бы на другом конце знали, как интерпритировать принимаемые данные.
В потоковом радио запущен процесс извлечения байтов из файлов и добавления этих Chunk-ов в очередь (стрим, буфер).
Поток может быть пустым!
При обращении к такому потоку по IP адресу сначала передаётся правило (формат) чтения, в случае mp3 это частота дискретизации, бит-рэйт и моно\стерео, а потом кусочки этого стрима по мере чтения.
В другом случае поток может быть сформирован и из одного файла выбранного на сервере по имени из запроса.
Совсем другое, когда по запросу name.mp3 скачивается файл. Это ничем не отличается от файлообменников.

hin4, на HiAsm будет весьма проблематично сделать что-либо путёвое и не глючное.
Есть много софта и готовых решений, но для этого нужно знать языки и разбираться в теме.
Леонид дал правильное заключение.
Только добавлю, что тема не из лёгких, даже при знании языков. По этому даже коробочное решение(SDK) вряд-ли будет полезно.
P.S.
В случае с микрофоном, сжатие мало чего даёт.
Поток течёт, да течёт и уходит в небытие.

Редактировалось 6 раз(а), последний 2019-08-21 13:10:37
карма: 6

0
Ответов: 194
Рейтинг: 2
#13: 2021-06-15 22:24:54 ЛС | профиль | цитата
WebSocketAudioServer
карма: 0

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)