Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2017, 16:13   #11
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Я вот и писал в посте #2 что в mp3 не получиться поток снять с микрофона в Bass да и через WaveOut и был удивлен что ты по mp3 поток делаешь с микрофона. Вот ответ от поста #7 по поводу mp3 http://www.programmersforum.ru/showthread.php?t=184813

Поищи использования других кодеков типа G711, GSM
вот ссылки на модули сжатия http://lakeofsoft.com/codec/
http://lakeofsoft.com/vc/download.html

Бесплатные модули для сжатия звука Freeware версия
http://lakeofsoft.com/vc/freeware.html

Последний раз редактировалось Aliens_wolfs; 02.01.2017 в 18:32.
Aliens_wolfs вне форума Ответить с цитированием
Старый 02.01.2017, 20:02   #12
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Использую Bass снятия звука с микрофона,затем кодирую в mp3 Lame_enc.dll на лету,
и отправляю на сервер сжатый mp3 данные. через Waveout работает если ни чего не делать, свернул или развернул любое окно ,то прерывается на это время звук и иногда вообще пропадает,пока не перезапустишь. сделано все в потоке ,почему то
Execute потока прекращает выполняться ,хотя сам поток вроде не закрыт.


VC components их давно уже пробовал еще лет 5 назад. да там есть и чат , но я делаю как в
scype,когда кто то говорит то у него прыгает progressbar.

Спасибо за ответы ,спасибо за помощь что помогаете разобраться.

Последний раз редактировалось АНАТОЛИЙ249; 02.01.2017 в 20:10.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 03.01.2017, 14:29   #13
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Вот тут нашел тоже самое у меня .
http://www.delphisources.ru/forum/sh...ad.php?t=16533

http://www.vr-online.ru/forum/zavisa...areheader-4045

как можно это исправить ?



procedure WaveOutProc(HWO: HWAVEOUT; uMsg: UINT;
dwInstance, dwParam1, dwParam2: DWORD); stdcall;
var
iError: Cardinal;
FPWavehdr: PWavehdr;
begin
with TBSTH(dwInstance) do
try
if (uMsg = WOM_DONE ) then
begin
FPWavehdr := PWavehdr(dwParam1);
iError := WaveOutUnprepareHeader(HWaveOut1^, FPWavehdr, SizeOf(TWaveHdr));
if ierror=0 then
begin
GlobalUnlock(DWORD(FPWavehdr));
GlobalFree(DWORD(FPWavehdr));
end;
end;
except
on E: Exception do

end;
end;






procedure TBSTH.Open(format:PWaveFormatEx);
var
waveformat:PWaveFormatEx;
maxsizeformat,i:integer;
begin
if (format<>nil) and (HWaveOut1=nil) then
begin
acmMetrics(0, ACM_METRIC_MAX_SIZE_FORMAT,MaxSizeF ormat);
getmem(WaveFormat, MaxSizeFormat);
move(format^,waveformat^,maxsizefor mat);
HWaveOut1:=new(PHWaveOut);

i := WaveOutOpen(HWaveOut1,0, waveformat, cardinal(@WaveOutProc),
Dword(self),CALLBACK_FUNCTION or WAVE_MAPPED);

if i<>0 then
begin
showmessage('Problem creating playing handle' + inttostr(i));
exit;
end;

end;
end;




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

i := WaveOutOpen(HWaveOut1,0, waveformat,0{cardinal(@WaveOutProc) },
Dword(self),CALLBACK_FUNCTION or WAVE_MAPPED);



как освободить правильно память ,те буферы которые уже не нужны,а просто занимают память. @WaveOutProc-не понятно как и сколько освобождается или все освобождается,
освободить хотя бы половину памяти которая занята для проигрывания буферов. которые уже отыграли и освободить память .




Спасибо за ответы и помощь.

Последний раз редактировалось АНАТОЛИЙ249; 03.01.2017 в 17:30.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 03.01.2017, 18:26   #14
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

На модулях ACMWaveIn.pas и ACMWaveOut.pas не пробовали?

Вот еще есть мой модуль по WaveOutIn на нем попробуйте сжатие сделать

в этом проекте все готово там шаблоны есть по открытию и заполнению wav заголовков, в обратном вызове сжатие делайте, там я написал
Вложения
Тип файла: rar RecMicWave.rar (165.0 Кб, 19 просмотров)

Последний раз редактировалось Aliens_wolfs; 03.01.2017 в 18:52.
Aliens_wolfs вне форума Ответить с цитированием
Старый 03.01.2017, 18:54   #15
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

То что я написал выше это и есть ACMWaveOut.pas с него, оно работает нормально ,только когда сворачиваешь окно или разворачиваешь окно ,то тогда затыкается, эти же проблемы описаны в этой ссылке один в один.

http://www.vr-online.ru/forum/zavisa...areheader-4045

если ни чего не трогать то работает нормально.

Попробовал RecMicWave.rar(FunctWave.pas) да работает но идет утечка памяти, потому что в
функции waweout не используеться очистка памяти (WaveOutUnPrepareHeader).

WaveOutUnPrepareHeader-используеться только в waweIn.

Спасибо за помощь.

Спасибо за ответы и помощь.

Последний раз редактировалось АНАТОЛИЙ249; 03.01.2017 в 19:19.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 03.01.2017, 19:35   #16
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Сейчас проверил этот проект нет утечки 30 минут работала программа, Очистка буфера там есть вы FunctWave.pas посмотрите в нем все реализованно

Код:
procedure TWaveOut.WaveInCallback(var msg: TMessage);  //this is called when is buffer full
var
   i: integer;
   Header: PWaveHdr;
begin

case Msg.Msg of
MM_WOM_CLOSE:
begin
FhWaveOut := 0;
if Assigned(FOnClose) then
FOnClose(Self);
end;
MM_WOM_DONE:
begin
Header:= PWaveHdr(msg.lparam);
FPlay:= false;
if Assigned(FOnStop) then
FOnStop(Self);
if(Header <> nil)then
begin

 i:= WaveOutUnPrepareHeader(FhWaveOut, Header, sizeof(TWaveHdr));
 if i <> 0 then
 if Assigned(FOnError) then
 FOnError(Self, SysUtils.Format('WaveOutPrepareHeader WaveOutCallback error: %d',[i]));

  if Header^.lpData <> nil then
  FreeMem(Header^.lpData);
  Header^.lpData:= nil;
  Header^.lpNext:= nil;
  dispose(Header);
  Header:= nil;
end;
end;
end;
end;
Я же не просто писал этот модуль он у меня до сих пор используется вместо ACMWave

Пример с контролем памяти в Caption
Вложения
Тип файла: rar RecMicWave.rar (171.3 Кб, 14 просмотров)

Последний раз редактировалось Aliens_wolfs; 03.01.2017 в 19:49.
Aliens_wolfs вне форума Ответить с цитированием
Старый 03.01.2017, 19:51   #17
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Не это понятно просто в waweoutplayback


procedure TWaveOut.PlayBack(data: pointer; size: longint);
var
i:integer;
Header:PWaveHdr;
msg: TMessage;
begin
New(Header);
FillChar(Header^, SizeOf(TWaveHdr), 0);
with Header^ do
begin
lpNext:= Header;
dwbufferlength:= Size;
dwbytesrecorded:= size;
dwUser:=0;
dwflags:=0;
dwloops:=0;
getmem(lpData, size);
FillChar(lpData^, size, 0);
move(data^, lpData^, size);
end;

i:= WaveOutPrepareHeader(FhWaveOut, Header, sizeof(TWaveHdr));
if i <> 0 then
begin
if Assigned(FOnError) then
FOnError(Self, Format('WaveOutPrepareHeader PlayBack error: %d',[i]));
msg.Msg:= MM_WOM_DONE;
msg.LParam:= Integer(Header);
WaveInCallback(msg);
Exit;
end;

i:= WaveOutWrite(FhWaveOut, Header, sizeof(TWaveHdr));
if i <> 0 then
begin
if Assigned(FOnError) then
FOnError(Self, Format('WaveOutWrite PlayBack error: %d',[i]));
msg.Msg:= MM_WOM_DONE;
msg.LParam:= Integer(Header);
WaveInCallback(msg);
end;


FPlay:= true;
end;

переменная I=0 всегда поэтому не заходит то что выделено жирным шрифтом.

Просто я не могу понять ,почему при сворачивании или разворачивании другого окна ,любого не в программе ,затыкаться звук. несколько раз развернешь свернешь и вообще прекращается, проверил не работает именно waweout.


Cпасибо за помощь.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 03.01.2017, 19:55   #18
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

А как в используете этот компонент AcmWave на форму его кидаете или создаете?
Цитата:
переменная I=0 всегда поэтому не заходит то что выделено жирным шрифтом.
Все правильно если будет i <> 0 то это считается ошибкой это значит ошибка в WaveOutPrepareHeader или в WaveOutWrite.
можно было конечно назвать nErr

У меня AcmWave работает даже при сворачивании вот пример
Вложения
Тип файла: rar RecMicAcmWave.rar (178.7 Кб, 13 просмотров)

Последний раз редактировалось Aliens_wolfs; 03.01.2017 в 20:15.
Aliens_wolfs вне форума Ответить с цитированием
Старый 03.01.2017, 20:20   #19
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Я его создаю,и какой нужен размер буфера нужно отправлять в waweout ,4096 или 8192, для нормальной работы ?

и как вложить сюда файлы ?



Спасибо за отвеьты и помощь.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 03.01.2017, 20:24   #20
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Что бы выложить сюда файлы то где вы пишите ответы есть кнопочка расширеный режим, расшириться ваше окно ниже будет кнопка управление приложениями, нажмете ее откроется окно там увидите загрузку вложений и все
Цитата:
Я его создаю,и какой нужен размер буфера нужно отправлять в waweout ,4096 или 8192, для нормальной работы ?
чем больше тем качественней звук 8192-нормально, но если еще больше делать то могут быть большие задержки с микрофона

Еще бы посмотреть ваш код по сжатию в mp3 и разжатию тогда мог бы у себя поэкспериментироватью
Для сжатия в mp3 я использовал код Lame_dll.pas а для разжатия я не нашел код

Последний раз редактировалось Aliens_wolfs; 03.01.2017 в 20:34.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО] bass.dll, Программа получает мп3 файл с сервера и воспроизводит его, как его сохранить в файл? NEoMASTERR Общие вопросы Delphi 0 25.01.2016 11:30
BASS.DLL и захват потока. Twister901 Visual C++ 1 15.01.2013 10:54
Bass.dll не воспроизводит m3u demiancz Мультимедиа в Delphi 19 30.10.2012 08:46
bass.dll Скорость мать его потока... Дворник Мультимедиа в Delphi 5 24.08.2010 09:37
микшер на два потока в проигрывателе музыки. проигрыватель сделан на основе библиотеки Bass.dll D-fens Мультимедиа в Delphi 4 08.06.2007 20:36