| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Запись звука |
| Автор: NoName 4.3.2003, 00:44 |
| Нужно 2 реализации: 1) Как записать звук с линейного выхода в файл? 2) Как прослушать звук с линейного входа на удаленном компьютере и записать на клиенте? |
| Автор: Vit 4.3.2003, 04:18 |
| http://forum.vingrad.ru/index.php?act=ST&f=32&t=870 |
| Автор: NoName 4.3.2003, 19:53 |
| Это понятно, а как сделать без использования MediaPlayer? |
| Автор: stab 4.3.2003, 20:21 |
| unit receiver; interface uses mmsystem, classes; const samp_per_sec = 44100; samp_cnt = samp_per_sec div 5; buf_len = samp_cnt * 2; type PSample16M = ^TSample16M; TSample16M = SmallInt; PArrayOfSample = ^TArrayOfSample; TArrayOfSample = array[1..samp_cnt] of TSample16M; TReceiver = class private hwi: Integer; fmt: tWAVEFORMATEX; whdr1: WAVEHDR; buf1: TArrayOfSample; whdr2: WAVEHDR; buf2: TArrayOfSample; FStoped: Boolean; FOnChange: TNotifyEvent; procedure SetStoped(const Value: Boolean); public Peak: Integer; Buffer: PArrayOfSample; destructor Destroy; override; procedure Start; procedure Stop; property Stoped: Boolean read FStoped write SetStoped; property OnChange: TNotifyEvent read FOnChange write FOnChange; end; var rec: TReceiver; implementation procedure waveInProc(const hwi, uMsg, dwInstance: Integer; var hdr: WAVEHDR; const dwP2: Integer); stdcall; const divs = samp_cnt div 100; var i, p: Integer; buf: PArrayOfSample; begin if rec.Stoped then Exit; case uMsg of WIM_OPEN: begin end; WIM_DATA: begin rec.Buffer := PArrayOfSample(hdr.lpData); buf := PArrayOfSample(hdr.lpData); p := 0; for i := 0 to samp_cnt div divs do p := p + Abs(buf[i * divs]); rec.Peak := p div (samp_cnt div divs); if Assigned(rec.FOnChange) then rec.FOnChange(rec); waveInUnprepareHeader(hwi, @hdr, SizeOf(WAVEHDR)); waveInPrepareHeader(hwi, @hdr, SizeOf(WAVEHDR)); waveInAddBuffer(hwi, @hdr, SizeOf(WAVEHDR)); end; WIM_CLOSE: begin end; end; end; { TReceiver } destructor TReceiver.Destroy; begin Stoped := True; inherited; end; procedure TReceiver.SetStoped(const Value: Boolean); begin FStoped := Value; if Value then begin waveInStop(hwi); waveInUnprepareHeader(hwi, @whdr1, SizeOf(WAVEHDR)); waveInUnprepareHeader(hwi, @whdr2, SizeOf(WAVEHDR)); waveInReset(hwi); waveInClose(hwi); end else begin with fmt do begin wFormatTag := WAVE_FORMAT_PCM; nChannels := 1; nSamplesPerSec := samp_per_sec; nBlockAlign := 2; nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; wBitsPerSample := 16; cbSize := 0; end; waveInOpen(@hwi, WAVE_MAPPER, @fmt, Cardinal(@waveInProc), hInstance, CALLBACK_FUNCTION); with whdr1 do begin lpData := @buf1; dwBufferLength := buf_len; dwBytesRecorded := 0; dwUser := 0; dwFlags := 0; dwLoops := 0; lpNext := nil; reserved := 0; end; waveInPrepareHeader(hwi, @whdr1, SizeOf(WAVEHDR)); waveInAddBuffer(hwi, @whdr1, SizeOf(WAVEHDR)); with whdr2 do begin lpData := @buf2; dwBufferLength := buf_len; dwBytesRecorded := 0; dwUser := 0; dwFlags := 0; dwLoops := 0; lpNext := nil; reserved := 0; end; waveInPrepareHeader(hwi, @whdr2, SizeOf(WAVEHDR)); waveInAddBuffer(hwi, @whdr2, SizeOf(WAVEHDR)); waveInStart(hwi); end; end; procedure TReceiver.Start; begin Stoped := False; end; procedure TReceiver.Stop; begin Stoped := True; end; initialization rec := TReceiver.Create; finalization rec.Free; end. вот. Вся работа осуществляется через глобальную переменную rec . Возможно это не лучшая реализация с точки зрения ООП, но работает 2 Vit: засунь это в ФАК, плиз, если это не очень убого |
| Автор: NoName 4.3.2003, 23:43 |
| Тогда еще два вопроса раз зашевелились люди ;) как передать звук по локалке и на клиенте записать? и второй вопрос: как писать стерео сигнал в разные файлы по каналам? P.S. Думаю что на этот вопрос тут уже не ответят... но всякое может быть |
| Автор: NoName 4.3.2003, 23:47 |
| И опять же, пример что ты кинул мне давал еще Озеров, этот пример есть в его сборнике faq, в этом примере отсутствует сохранение потока в файл, а это опять же очень интересно, я думаю |
| Автор: stab 6.3.2003, 07:28 |
| в чем проблема я понять не могу?! записывать звук можешь? формат *.wav файлов знаешь? что такое сокет знаешь? или ты хочеш что б я те готовую прогу выложил?! если так то скока заплатиш |
| Автор: NoName 6.3.2003, 18:13 |
| Да уж, это называется форум. Если говоришь об оплате то нефиг писать тут, я так понимаю сама концепция форума подразумевает помощь в ответе на вопрос, а не продажа какого-то кусочка программы выдранной откуда-то. Все с тобой ясно |
| Автор: AntonSaburov 6.3.2003, 18:43 | ||
Форум подразумевает помощь в критических или непонятных ситуациях. Тебе дают направление - а дальше уже сам двигаешься. А ты хочешь по сути полностью готовое приложение. Если ты в целях обучения это делаешь - то пойми, что здесь часто появляются люди для которых программирование - это работа. И они не могут тратить много своего времени. Им просто надо кормить свои семьи, родителей. А если тебе по работе надо - так это ТВОЯ работа и старайся ее делать все-таки сам. Целиком такую программу написать - это достаточно долгий процесс (Если пример занимает больше 30 минут, то это уже долго). Может нам в помощь тебе и за твоей девушкой ухаживать ? Без обид. Просто хотелось донести основную идею. |
| Автор: NoName 6.3.2003, 21:17 |
| Идея понятно, теперь на все вопросы буду отвечать, а сколько заплатишь. Без обид |
| Автор: Vit 6.3.2003, 23:00 |
| Модератор: давайте прекратим споры, тем более в этом направлении. На форуме действительно отвечают на конкретно заданный вопрос, а не на просьбу написать программу целиком. По теме было приведено 2 ответа по существу. Вопрос к автору топика - они достаточно исчерпывающие или требуются объяснения, дополнения или другие решения? |
| Автор: NoName 7.3.2003, 18:16 |
| Уже ничего не требуется, добрые люди помогли |