![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Цитата:
|
|
#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. |
|
#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 байта. Для начала вам нужно найти примеры с использованием такой структуры, в сети их полно.
|
|
#7
|
|||
|
|||
|
Я менял 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; |
|
#8
|
||||
|
||||
|
Интересный код:
Код:
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; |
|
#9
|
|||
|
|||
|
Понял в чем ошибка была,нужно было курсор в начало переставить,а то он дописывал, а не переписывал
Но я создавал массив под данные произвольно: Код:
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; Вроде все правильно делаю,а выдает ошибку на выделенной строчке. Подскажите что не так, уже все перепробовал. Нужна помошь! |
|
#10
|
||||
|
||||
|
Скорее всего несовпадение типов. В следующий раз приводи текст ошибки или сам переводи. Уверяю это не сложно.
![]() |
|
#11
|
|||
|
|||
|
Вот что пишет при нажатии кнопки 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. |