Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.
Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.
Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.
[QUOTE][B]Пример записи wav[/B]
Наконец дошли руки написал процедуру записи wav файлов.
Отмечаю следующие особенности: Запись [B] TWaveHeaderChank[/B] следует обявлять с директивой [B]packed[/B], в связи с тем, что формат wav подразумевает выравнивание на границу 2 байт, а delphi по умалчанию выравнивает на границу 4 байт. Т.о. размер структуры [B] TWaveHeaderChank[/B] без диретивы [B] packed[/B] будет занимать 20 байт(структура в примере программ) вместо положенных 18.
Следующая программа записывает одноканальный wav файл длительностью 10 сек, 16 бит выборка. Звук будет напоминать свисты коротковолнового радиоприемника.
[FONT="] TWaveHeaderChank = [B][COLOR=black]packed[/COLOR][/B] [B][COLOR=black]record[/COLOR][/B] [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT="]Заголвок[/FONT][/COLOR][COLOR=navy][FONT="] ([/FONT][/COLOR][COLOR=navy][FONT="]чанк[/FONT][/COLOR][COLOR=navy][FONT="]) [/FONT][/COLOR][COLOR=navy][FONT="]формата[/FONT][/COLOR][/I][FONT="] [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]wFormatTag : Smallint; [/FONT]
[FONT="] wChannels : WORD; [/FONT]
[FONT="] wSamplesPerSec : Cardinal; [/FONT]
[FONT="] wAvgBytesPerSec: Cardinal; [/FONT]
[FONT="] wBlockAlign : WORD; [/FONT]
[FONT="] wBitsPerSample : WORD; [/FONT]
[FONT="] wcbSize : WORD; [/FONT]
[FONT="] [B][COLOR=black]end[/COLOR][/B];[/FONT] [FONT=Courier New CYR]-------------------------------------------------------------------[/FONT]
[B][COLOR=black][FONT="]Const[/FONT][/COLOR][/B][FONT="] [/FONT]
[FONT="] noError = [COLOR=navy]0[/COLOR]; [/FONT]
[FONT="] ReadError = [COLOR=navy]1[/COLOR]; [/FONT]
[FONT="] HeaderError = [COLOR=navy]2[/COLOR]; [/FONT]
[FONT="] DataError = [COLOR=navy]3[/COLOR]; [/FONT]
[FONT="] FileCorrupt = [COLOR=navy]4[/COLOR]; [/FONT]
[FONT=Courier New] [/FONT][FONT="]IncorectFileFormat = [COLOR=navy]5[/COLOR]; [/FONT]
[FONT="] HeaderWriteError = [COLOR=navy]6[/COLOR]; [/FONT]
[FONT="] StreamError = [COLOR=navy]7[/COLOR];[/FONT] [FONT=Courier New CYR]-------------------------------------------------------------------[/FONT]
[B][COLOR=black][FONT="]Function[/FONT][/COLOR][/B][FONT="] WriteWave(FileName : AnsiString; data : TWaveResult) : WORD; [/FONT]
[B][COLOR=black][FONT="]var[/FONT][/COLOR][/B][FONT="] [/FONT]
[FONT="] f : TFileStream; [/FONT]
[FONT="] wFileSize : Cardinal; [/FONT]
[FONT="] wChankSize : Cardinal; [/FONT]
[FONT="] ID : [B][COLOR=black]array[/COLOR][/B][[COLOR=navy]0[/COLOR]..[COLOR=navy]3[/COLOR]] [B][COLOR=black]of[/COLOR][/B] Char; [/FONT]
[FONT="] Header : TWaveHeaderChank; [/FONT]
[FONT="] [/FONT]
[B][COLOR=black][FONT="]Begin[/FONT][/COLOR][/B][FONT="] [/FONT]
[FONT="] Result := noError; [/FONT]
[FONT="] [B][COLOR=black]Try[/COLOR][/B] [/FONT]
[FONT="] f := TFileStream.Create(FileName, fmCreate); [/FONT]
[FONT="] f.Seek([COLOR=navy]0[/COLOR], soFromBeginning); [/FONT]
[FONT="] [/FONT]
[FONT="] Header.wFormatTag := [COLOR=navy]1[/COLOR]; [/FONT]
[FONT="] Header.wChannels := data.wChannels; [/FONT]
[FONT="] Header.wSamplesPerSec := data.wSamplesPerSec; [/FONT]
[FONT="] Header.wBlockAlign := data.wChannels * (data.wBitsPerSample [B][COLOR=black]div[/COLOR][/B] [COLOR=navy]8[/COLOR]); [/FONT]
[FONT="] Header.wAvgBytesPerSec:= data.wSamplesPerSec * Header.wBlockAlign; [/FONT]
[FONT="] Header.wBitsPerSample := data.wBitsPerSample; [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]Header.wcbSize := [COLOR=navy]0[/COLOR]; [I][COLOR=navy]//нет дополнительного блока[/COLOR][/I] [/FONT]
[FONT="] [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]ID := [COLOR=#500080]'RIFF'[/COLOR]; [/FONT]
[FONT="] f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]); [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]wFileSize := [COLOR=navy]0[/COLOR]; [I][COLOR=navy]//пока не известен[/COLOR][/I] [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]f.WriteBuffer(wFileSize, [COLOR=navy]4[/COLOR]); [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]ID := [COLOR=#500080]'WAVE'[/COLOR]; [/FONT]
[FONT="] f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]); [I][COLOR=navy]//Запись идентификатора формата[/COLOR][/I] [/FONT]
[FONT="] [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]ID := [COLOR=#500080]'fmt '[/COLOR]; [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]); [I][COLOR=navy]//Запись идентификатора чанка формата[/COLOR][/I] [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]wChankSize := SizeOf(Header); [/FONT]
[FONT="] f.WriteBuffer(wChankSize, [COLOR=navy]4[/COLOR]); [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT="]Запись[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]размера[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]чанка[/FONT][/COLOR][/I][FONT="] [/FONT]
[FONT="] f.WriteBuffer(Header, SizeOf(Header)); [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT="]Запись[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]чанка[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]формата[/FONT][/COLOR][/I][FONT="] [/FONT]
[FONT="] [/FONT]
[FONT="] [B][COLOR=black]except[/COLOR][/B] [/FONT]
[FONT="] Result := HeaderWriteError; [/FONT]
[FONT="] [B][COLOR=black]end[/COLOR][/B]; [/FONT]
[FONT="] [/FONT]
[FONT="] [B][COLOR=black]Try[/COLOR][/B] [/FONT]
[FONT="] ID := [COLOR=#500080]'data'[/COLOR]; [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]f.WriteBuffer(ID, [COLOR=navy]4[/COLOR]); [I][COLOR=navy]//Запись чанка данных[/COLOR][/I] [/FONT]
[FONT="] wChankSize := data.Data.Size; [I][COLOR=navy]//Запись размера чанка[/COLOR][/I] [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]f.WriteBuffer(wChankSize, [COLOR=navy]4[/COLOR]); [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT="]Запись[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]данных[/FONT][/COLOR][/I][FONT="] [/FONT]
[FONT="] data.Data.Seek([COLOR=navy]0[/COLOR], soFromBeginning); [/FONT]
[FONT="] f.CopyFrom(data.Data, data.Data.Size); [/FONT]
[FONT="] [/FONT]
[FONT="] [B][COLOR=black]except[/COLOR][/B] [/FONT]
[FONT="] Result := StreamError; [/FONT]
[FONT="] [B][COLOR=black]end[/COLOR][/B]; [/FONT]
[FONT="] f.Seek(SizeOf(ID), soFromBeginning); [I][COLOR=navy]//[/COLOR][/I][/FONT][I][COLOR=navy][FONT="]Поиск[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]записи[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]размера[/FONT][/COLOR][COLOR=navy][FONT="] [/FONT][/COLOR][COLOR=navy][FONT="]файла[/FONT][/COLOR][/I][FONT="] [/FONT]
[FONT="] wFileSize := f.Size - SizeOf(ID) - SizeOf(wFileSize); [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]f.[B][COLOR=black]Write[/COLOR][/B](wFileSize, [COLOR=navy]4[/COLOR]); [I][COLOR=navy]//Запись размера файла - заголовок[/COLOR][/I] [/FONT]
[FONT=Courier New CYR] [/FONT][FONT="]f.Free; [/FONT]
[B][COLOR=black][FONT="]end[/FONT][/COLOR][/B][FONT="]; [/FONT]
[FONT="] [/FONT]
[B][COLOR=black][FONT="]procedure[/FONT][/COLOR][/B][FONT="] TForm1.Button2Click(Sender: TObject); [/FONT]
[B][COLOR=black][FONT="]var[/FONT][/COLOR][/B][FONT="] [/FONT]
[FONT="] r : TWaveResult; [/FONT]
[FONT="] i : Integer; [/FONT]
[FONT="] d : SmallInt; [/FONT]
[FONT="] [/FONT]
[B][COLOR=black][FONT="]begin[/FONT][/COLOR][/B][FONT="] [/FONT]
[FONT="] r.ERROR := noError; [/FONT]
[FONT="] r.wSamplesPerSec := [COLOR=navy]44100[/COLOR]; [/FONT]
[FONT="] r.wBitsPerSample := [COLOR=navy]16[/COLOR]; [/FONT]
[FONT="] r.wChannels := [COLOR=navy]1[/COLOR]; [/FONT]
[FONT="] r.Data := TMemoryStream.Create; [/FONT]
[FONT="] r.Data.Seek([COLOR=navy]0[/COLOR], soFromBeginning); [/FONT]
[FONT="] [/FONT]
[FONT="] [B][COLOR=black]For[/COLOR][/B] i := [COLOR=navy]1[/COLOR] [B][COLOR=black]to[/COLOR][/B] [COLOR=navy]10[/COLOR] * r.wSamplesPerSec [/FONT]
[FONT="] [B][COLOR=black]do[/COLOR][/B] [/FONT]
[FONT="] [B][COLOR=black]Begin[/COLOR][/B] [/FONT]
[FONT="] d := Round(High(SmallInt) * Sin([COLOR=navy]2[/COLOR] * Pi * ([COLOR=navy]5[/COLOR] * i / r.wSamplesPerSec) * ([COLOR=navy]500[/COLOR] * i / r.wSamplesPerSec))); [/FONT]
[FONT="] r.Data.WriteBuffer(d, [COLOR=navy]2[/COLOR]); [/FONT]
[FONT="] [B][COLOR=black]end[/COLOR][/B]; [/FONT]
[FONT="] WriteWave([COLOR=#500080]'Sample.wav'[/COLOR], r); [/FONT]
[FONT="] r.Data.Free; [/FONT]
[B][COLOR=black][FONT="]end[/FONT][/COLOR][/B][FONT="];[/FONT][/QUOTE]