![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Поискал по поиску инфу на эту тему,из более менее понятного нашел это: http://www.kansoftware.ru/?tid=4832
Вроде бы работает нормально,но я не смог разобраться в принципе работы Там вообщем то вся суть заключена в этом(про структуру wav прочитал): Код:
Channeles := Ch; SamplesPerSec := Freq; BitsPerSample := Bits; и т.д. В примере было так: Код:
TWaveHeader = record idRiff: array[0..3] of char; RiffLen: longint; idWave: array[0..3] of char; idFmt: array[0..3] of char; InfoLen: longint; WaveType: smallint; Ch: smallint; Freq: longint; BytesPerSec: longint; align: smallint; Bits: smallint; end; TDataHeader = record idData: array[0..3] of char; DataLen: longint; end; Код:
TWaveHeader = record idRiff: array[0..3] of char; RiffLen: longint; idWave: array[0..3] of char; idFmt: array[0..3] of char; InfoLen: longint; WaveType: smallint; Ch: smallint; Freq: longint; BytesPerSec: longint; align: smallint; Bits: smallint; idData: array[0..3] of char; DataLen: longint; end; Тогда непонятно по какому принципу считывается информация,поясните пожалуйста. И как мне в таком случае считать только звуковую информацию или как считывать с определенного байта(прочитал что заголовки 44 байта занимают)? |
#2
|
||||
|
||||
![]() Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
![]() Структуру то я нашел:
http://visualprogs.medyal.ru/all/3.html только что с того, я не понимаю как считывается информация и не могу поэтому считать то что нужно |
#4
|
||||
|
||||
![]() И чего не понял?
Код:
Channeles := Ch; SamplesPerSec := Freq; BitsPerSample := Bits; Код:
TWaveHeader = record idRiff: array[0..3] of char; RiffLen: longint; idWave: array[0..3] of char; idFmt: array[0..3] of char; InfoLen: longint; WaveType: smallint; Ch: smallint; Freq: longint; BytesPerSec: longint; align: smallint; Bits: smallint; end; Читается скорее всего через BlockRead. Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
![]() Почему же тогда так не работает?
Код:
TWaveHeader = record idRiff: array[0..3] of char; RiffLen: longint; idWave: array[0..3] of char; idFmt: array[0..3] of char; InfoLen: longint; WaveType: smallint; Ch: smallint; Freq: longint; BytesPerSec: longint; align: smallint; Bits: smallint; idData: array[0..3] of char; DataLen: longint; end; |
#6
|
||||
|
||||
![]() Почему кто-то разбил на 2 record-а, известно только ему. Второй record, считывает первый 8 байт, первый остальное. Данные в WAV файле (44 байта) идут последовательно, смена положения полей при неизменной длине всей структуры ничего страшного не даёт, а вот интерпретация будет, естественно, неверной. BlockRead читает информацию из файла блоками, в данном случае он за один раз может считать в структуру все 44 байта. Для начала вам нужно найти примеры с использованием такой структуры, в сети их полно.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
![]() Поразбирался еще,вроде бы вот так нужно считывать:
Код:
TWaveHeader = record idRiff: array[0..3] of char; RiffLen: longint; idWave: array[0..3] of char; idFmt: array[0..3] of char; InfoLen: longint; WaveType: smallint; Ch: smallint; Freq: longint; BytesPerSec: longint; align: smallint; Bits: smallint; idData: array[0..3] of char; DataLen: longint; Data: array[0..10000000] of SmallInt;//по 2 байта Но до конца не уверен,вывел на график в chart, вроде похоже,но чтоб наверняка решил сохранить звуковые данные из одного файла в другой,записал так: Код:
TWaveHeader = record idRiff: array[0..3] of char; RiffLen: longint; idWave: array[0..3] of char; idFmt: array[0..3] of char; InfoLen: longint; WaveType: smallint; Ch: smallint; Freq: longint; BytesPerSec: longint; align: smallint; Bits: smallint; idData: array[0..3] of char; DataLen: longint; Data: array[0..10000000] of SmallInt;//по 2 байта end; TWaveHeader1 = record idRiff1: array[0..3] of char; RiffLen1: longint; idWave1: array[0..3] of char; idFmt1: array[0..3] of char; InfoLen1: longint; WaveType1: smallint; Ch1: smallint; Freq1: longint; BytesPerSec1: longint; align1: smallint; Bits1: smallint; idData1: array[0..3] of char; DataLen1: longint; Data1: array[0..10000000] of SmallInt; end; var Form1: TForm1; F,E: TFileStream; WaveHeader: TWaveHeader; WaveHeader1: TWaveHeader1; i: integer; Dat: array[0..10000000] of SmallInt; procedure TForm1.Button1Click(Sender: TObject); begin if opendialog1.Execute then F:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead); F.Read(WaveHeader, sizeof(TWaveHeader)); with WaveHeader do begin for i:=0 to 10000000 do dat[i]:=data[i]; end; end; procedure TForm1.Button6Click(Sender: TObject); begin if opendialog1.Execute then E:= TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite); E.Read(WaveHeader1, sizeof(TWaveHeader1)); with WaveHeader1 do begin for i:=0 to 10000000 do data1[i]:=dat[i]; E.Write(WaveHeader1, sizeof(TWaveHeader1)); end; end; end. И получается непонятная фигня в итоге, сохраненный файл(номер 2), длиной 1:59, до 1:53 точно такой же как и был,а потом уже оставшиеся 6 секунд с исходного файла(номер 1),с его начала. А вот если в массивах везде поменять размерность на порядок(и на увеличение и на уменьшение), то вообще ничего не меняется в записанном файле. Вот что я не так делаю? |
#8
|
||||
|
||||
![]() Поразбирался, но мало. Представь себе 2 битмапа, один 8-битный, а 2 - 24-х, при этом ещё и разного размера. И вот ты копируешь данные из одного в другой не трогая "шапку". Что получится? Полная фигня. Так вот, у WAV-файлов гораздо больше вариаций хранения данных и просто так данные из одного в другой, не корректируя "шапку", не перекинешь.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
|||
|
|||
![]() Я менял datalen, нужно было еще Rifflen и InfoLen,потому что остальное одинаковое,файлы однотипные, поменял на всякий случай все:
Код:
procedure TForm1.Button1Click(Sender: TObject); begin if opendialog1.Execute then F:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead); F.Read(WaveHeader, sizeof(TWaveHeader)); with WaveHeader do begin memo1.Lines.Text:=inttostr(dataLen); RiffLe:=Rifflen; InfoLe:=Infolen; DataLe:=Datalen; WaveTyp:=WaveType; C:=Ch; Fre:=Freq; BytesPerSe:=BytesPerSec; alig:=align; Bit:=Bits; for i:=0 to 10000000 do dat[i]:=data[i]; end; end; procedure TForm1.Button6Click(Sender: TObject); begin if opendialog1.Execute then E:= TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite); E.Read(WaveHeader1, sizeof(TWaveHeader1)); with WaveHeader1 do begin RiffLen1:=Riffle; InfoLen1:=Infole; DataLen1:=Datale; WaveType1:=WaveTyp; Ch1:=C; Freq1:=Fre; BytesPerSec1:=BytesPerSe; align1:=alig; Bits1:=Bit; for i:=0 to 10000000 do data1[i]:=dat[i]; E.Write(WaveHeader1, sizeof(TWaveHeader1)); end; end; |
#10
|
||||
|
||||
![]() Интересный код:
Код:
procedure TForm1.Button6Click(Sender: TObject); begin if opendialog1.Execute then E:= TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite); E.Read(WaveHeader1, sizeof(TWaveHeader1)); with WaveHeader1 do begin RiffLen1:=Riffle; InfoLen1:=Infole; DataLen1:=Datale; WaveType1:=WaveTyp; Ch1:=C; Freq1:=Fre; BytesPerSec1:=BytesPerSe; align1:=alig; Bits1:=Bit; for i:=0 to 10000000 do data1[i]:=dat[i]; E.Write(WaveHeader1, sizeof(TWaveHeader1)); end; end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
|||
|
|||
![]() Понял в чем ошибка была,нужно было курсор в начало переставить,а то он дописывал, а не переписывал
Но я создавал массив под данные произвольно: Код:
Data: array[0..10000000] of SmallInt; Код:
procedure TForm1.Button1Click(Sender: TObject); begin if opendialog1.Execute then F:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead); setlength(dat,1000000); // 1000000 просто чтобы потестить with WaveHeader do setlength(data,1000000); F.Read(WaveHeader, sizeof(TWaveHeader)); with WaveHeader do begin memo1.Lines.Text:=inttostr(dataLen); RiffLe:=Rifflen; InfoLe:=Infolen; DataLe:=Datalen; WaveTyp:=WaveType; C:=Ch; Fre:=Freq; BytesPerSe:=BytesPerSec; alig:=align; Bit:=Bits; for i:=0 to 100 do // 100 просто чтобы потестить dat[i]:=data[i]; end; end; Вроде все правильно делаю,а выдает ошибку на выделенной строчке. Подскажите что не так, уже все перепробовал. Нужна помошь! |
#12
|
||||
|
||||
![]() Скорее всего несовпадение типов. В следующий раз приводи текст ошибки или сам переводи. Уверяю это не сложно.
![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
|||
|
|||
![]() Вот что пишет при нажатии кнопки 1:
![]() Вот весь код если что: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart; type TWaveHeader = record idRiff: array[0..3] of char; RiffLen: longint; idWave: array[0..3] of char; idFmt: array[0..3] of char; InfoLen: longint; WaveType: smallint; Ch: smallint; Freq: longint; BytesPerSec: longint; align: smallint; Bits: smallint; idData: array[0..3] of char; DataLen: longint; Data: array of SmallInt; end; TWaveHeader1 = record idRiff1: array[0..3] of char; RiffLen1: longint; idWave1: array[0..3] of char; idFmt1: array[0..3] of char; InfoLen1: longint; WaveType1: smallint; Ch1: smallint; Freq1: longint; BytesPerSec1: longint; align1: smallint; Bits1: smallint; idData1: array[0..3] of char; DataLen1: longint; Data1: array of SmallInt; end; TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Memo1: TMemo; Button2: TButton; Button3: TButton; Chart1: TChart; Series1: TLineSeries; Button4: TButton; Edit1: TEdit; Button5: TButton; Edit2: TEdit; Button6: TButton; Memo2: TMemo; OpenDialog2: TOpenDialog; procedure Button1Click(Sender: TObject); //procedure Button2Click(Sender: TObject); //procedure Button3Click(Sender: TObject); //procedure Button4Click(Sender: TObject); //procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; F,E: TFileStream; WaveHeader: TWaveHeader; WaveHeader1: TWaveHeader1; i: integer; Dat: array of SmallInt; RiffLe: longint; InfoLe: longint; DataLe: longint; WaveTyp: smallint; C: smallint; Fre: longint; BytesPerSe: longint; alig: smallint; Bit: smallint; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if opendialog1.Execute then F:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead); setlength(dat,1000000); // 1000000 ïðîñòî ÷òîáû ïîòåñòèòü with WaveHeader do setlength(data,1000000); F.Read(WaveHeader, sizeof(TWaveHeader)); with WaveHeader do begin memo1.Lines.Text:=inttostr(dataLen); RiffLe:=Rifflen; InfoLe:=Infolen; DataLe:=Datalen; WaveTyp:=WaveType; C:=Ch; Fre:=Freq; BytesPerSe:=BytesPerSec; alig:=align; Bit:=Bits; for i:=0 to 100 do // 100 ïðîñòî ÷òîáû ïîòåñòèòü dat[i]:=data[i]; end; end; procedure TForm1.Button6Click(Sender: TObject); begin if opendialog1.Execute then E:= TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite); E.Read(WaveHeader1, sizeof(TWaveHeader1)); with WaveHeader1 do begin RiffLen1:=Riffle; InfoLen1:=Infole; DataLen1:=Datale; WaveType1:=WaveTyp; Ch1:=C; Freq1:=Fre; BytesPerSec1:=BytesPerSe; align1:=alig; Bits1:=Bit; for i:=0 to 10000000 do data1[i]:=dat[i]; end; E.Seek(0,sofrombeginning); E.Write(WaveHeader1, sizeof(TWaveHeader1)); end; end. |