Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];

Вниз

!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 вся ветка

Форум: "Media";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
6-92164
Lamer111
2003-06-21 00:19
2003.08.28
чат и интернет


14-92186
SeAl
2003-08-10 15:15
2003.08.28
Прокся


7-92287
Globa
2003-06-15 11:57
2003.08.28
Технология написания Shell a для Windows


7-92292
StAL
2003-06-06 12:53
2003.08.28
Запись в Kernel32 под 9х


14-92224
Proger_XP
2003-08-10 11:03
2003.08.28
Как отправить по мылу что-нибудь?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский