Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.28;
Скачать: CL | DM;

Вниз

!Wave файлы!....   Найти похожие ветки 

 
maker ©   (2002-11-25 18:55) [0]

Мастера подскажите пожалуйста как прочитать именно волну 16-ти битного Wave файла (stereo или mono). Вообще как это происходит и какие это данные (DWord, SmallInt или др.) Самое главное как их прочитать. (Желательно примерчик)


 
apay ©   (2002-11-26 01:05) [1]

если PCM, то после заголовка 44 байт идут данные по слову на сэмпл (по два сова для stereo). подробнее см.: http://www.graphicon.ru:8105/courses/cg02b/assigns/hw-2/help/wavfmt2.htm
или задай поиск


 
maker ©   (2002-11-27 13:11) [2]

А как эти данные получать, задача в том, что необходимо кусок wav файла(PCM) на bitmap, как получит цифры(o),?

//PS: Ля-ля-ля жу-жу-жу я сегодня торможу....


 
trotski   (2002-11-29 06:40) [3]

Ползешь по Wave файлу до того момента, как не наткнешься на слово data, а потом пойдут отсчеты амплитуды. В зависимости от того, каков формат файла, на каждый отсчет времени будет разный размер ( стерео/моно, 8/16 бит ) А вообще почитай о структуре PCM формата.


 
maker ©   (2002-11-29 20:54) [4]

с 8-битным форматом понятно, там нужно читать (байт, байт, байт, байт...), а вот проблема с 16 битным, по моему пониманю там нужно читать (2байта, 2байта...) а потом из 2Байта получать значение от –32768 до 32767, а как его получить я незнаю... (хе-х)...


 
trotski   (2002-11-29 21:50) [5]

А кто тебе мешает сделать так :
type
TWaveRec=record
LeftCh:word;
RightCh:word;
end;
var
( WaveFile,bw,sizeof(bw) А кто тебе мешает сделать так :
type
TWaveRec=record
LeftCh:word;
RightCh:word;
end;
var
bw:TWaveRec;
.....
Read(WaveFile,bw,sizeof(bw));

Или что-то похожее. А насчет максимальной амплитуды, то ты прав, это 2 в степени Количество_бит-1


 
maker ©   (2002-11-29 23:07) [6]

Спасибо, это очень помогло.


 
maker ©   (2002-11-30 09:53) [7]

У меня ещё вопрос, как эти данные получать в цифровом виде, еу типа LeftCh[x]=652, RightCh[x]=7862 и тд. До отправки на звуковуху мне необходимо отрисовать волну файла (WinAMP, CoolEdit Pro и т.д.) но с 16 дитными у мя чудеса получаются....(хе-х)

Вот код которым я пытаюсь это стделать:

type
TWaveRec=record
LeftCh:array [1..1024] of word;
RightCh:array [1..1024] of word;
end;
...
var
bw:TWaveRec;
begin
TFileStream.Create(FileName,$0000);
...
wFile.Position:=dwDataEnd; //Выясненный конец data
wFile.Read(bw,SizeOf(bw)); // читаю в буфер (bw=record)
...
16:
begin
for i:=1 to 1024 do
Canvas.LineTo(i,int64(bw.LeftCh[i])); //???
( shr x)
У меня ещё вопрос, как эти данные получать в цифровом виде, еу типа LeftCh[x]=652, RightCh[x]=7862 и тд. До отправки на звуковуху мне необходимо отрисовать волну файла (WinAMP, CoolEdit Pro и т.д.) но с 16 дитными у мя чудеса получаются....(хе-х)

Вот код которым я пытаюсь это стделать:

type
TWaveRec=record
LeftCh:array [1..1024] of word;
RightCh:array [1..1024] of word;
end;
...
var
bw:TWaveRec;
begin
TFileStream.Create(FileName,$0000);
...
wFile.Position:=dwDataEnd; //Выясненный конец data
wFile.Read(bw,SizeOf(bw)); // читаю в буфер (bw=record)
...
16:
begin
for i:=1 to 1024 do
Canvas.LineTo(i,int64(bw.LeftCh[i])); //???
//??? значение должно быть 0..255(shr x)
end;

Какие у меня ошибки?!..


 
maker ©   (2002-12-03 20:52) [8]

^
Плизз!...


 
Ketmar ©   (2002-12-03 21:29) [9]

а вот не надо массивов делать. данные идут так:
do
readword(left);
( right)
а вот не надо массивов делать. данные идут так:
do
readword(left);
readword(right);
loop


Satanas Nobiscum! 03-Dec-XXXVII A.S.


 
Roman Go   (2002-12-07 09:43) [10]

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

з.с. только сильно не пинайте, программист из меня как из некоторых балерина


 
Popury   (2003-01-20 11:22) [11]

Во-первых, надо не word, а Smallint. Word - это 0..65525, а Smallint - -32768..32767.
Во-вторых, запись нужно определить таки с чередованием левого и правого каналов:

TWaveRec=record
LeftCh: Smallint;
RightCh: Smallint;
end;

Проще всего завести 2 переменные, скажем L, R: Integer (или Int64, если надо). Далее, после чтения одного отсчета, а это будет 4 байта, выполнить преобразование Smallint в Integer(Int64) обыкновеннейшим присвоением:

L:=bw.LeftCh; R:= bw.RightCh;

потом делать свои черные дела, используя L и R.


 
maker ©   (2003-01-20 13:11) [12]

всёравно торможу, кинте чтоль кусочек кода, а то у меня такое получается... (вот досада..)


 
Popury   (2003-01-23 09:38) [13]

Я же кинул информацию на maker@stsland.ru еще 21.01 !


 
maker ©   (2003-01-25 17:42) [14]

О всё получилось, спасибо всем, особенно Popury... :)


 
SibMonk   (2003-02-07 10:24) [15]

А если нужно то-же самое сделать с mp3 файлом??? И хотелось бы прямо в процессе воспроизведения...


 
maker ©   (2003-02-07 15:21) [16]

SibMonk (07.02.03 10:24) -->
Этот вопрос я тоже щас изучаю. Имеются исходники MP3 декодера (аж 2), да вот они на "Си", в котором, к сожалению, я ничего не понимаю :(


 
Roman Go ©   (2003-02-17 16:21) [17]

Maker, Popury киньте мне тоже информацию на ящик по данному вопросу, кусочек кода, конечно если можно хотелось бы больше всего.


 
popury   (2003-04-29 13:02) [18]

Вообще-то я откопал хороший кусок исходников, который решает проблему записи wav-файла:

http://www.gnomehome.demon.nl/uddf/pages/sound.htm#sound0

Я внес изменения (старое закомментировано):

// Function SetupRecord(P : PWaveRecorder) : Boolean;
Function SetupRecord : Boolean;

iErr := waveInOpen(
( @BufferDoneCallBack) Вообще-то я откопал хороший кусок исходников, который решает проблему записи wav-файла:

http://www.gnomehome.demon.nl/uddf/pages/sound.htm#sound0

Я внес изменения (старое закомментировано):

// Function SetupRecord(P : PWaveRecorder) : Boolean;
Function SetupRecord : Boolean;

iErr := waveInOpen(
@WaveIn
, WAVE_MAPPER
, pWaveFmtEx
, Integer(@BufferDoneCallBack)
// , Integer(P)
, Integer(Self)
, CALLBACK_FUNCTION + WAVE_ALLOWSYNC
);

//WaveRecorder.SetupRecord(@WaveRecorder);
WaveRecorder.SetupRecord;



Страницы: 1 вся ветка

Текущий архив: 2003.08.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
3-91989
Admin
2003-08-05 07:11
2003.08.28
Программа с MySQL.


3-92023
Anna
2003-08-05 09:42
2003.08.28
Поиск данных


6-92159
Patriot
2003-06-19 03:03
2003.08.28
WebBrowser и RichEdit


3-91976
старичок
2003-08-01 11:31
2003.08.28
Помогите SQL запрос


3-92050
Nikolay M.
2003-08-04 10:48
2003.08.28
MIDAS, ReconcileError и ClientDataSet.Append