![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Формат WAV GSM 6.10 Определить длительность звучания [D6, Win2k]
M3 © (2008-09-26 14:41:00)type
TWavHeader = record
Marker1: array[0..3] of Char; // RIFF
BytesFollowing: Longint;
Marker2: array[0..3] of Char; // WAVE
Marker3: array[0..3] of Char; // fmt
Subchunk1Size: Longint;
AudioFormat : Word;
NumChannels : Word;
nSamplesPerSec: Longint;
nAvgBytesPerSec : Longint;
nBlockAlign : Word;
nBitsPerSample: Word;
Subchunk2ID : array[0..3] of Char;
Subchunk2Size : Longint;
end;
H : TWAveHeader;
Читаю Header из файла WAV (сжат GSM длительность 17 секунд)
Получаю
('R', 'I', 'F', 'F')
39889
('W', 'A', 'V', 'E')
('f', 'm', 't', ' ')
20
49 - GSM
1
11025
2239
65
0
(#2, #0, '@', #1) -
1635017060
Не пойму почему такой странные Subchunk2ID
и как длительность определить исходя из Subchunk2Size,
примеры с исходниками вроде:
dur := trunc((Int64(1000) * header.Subchunk2Size div
header.nBitsPerSample) / 1000);
не подходят в данном случае ???
Trunk (2008-10-20 17:35:00) [1]> a
> AudioFormat : Word;
> NumChannels : Word;
> nSamplesPerSec: Longint;
> nAvgBytesPerSec : Longint;
> nBlockAlign : Word;
> nBitsPerSample: Word;
> - это 16
К этим 16нужно добавить ещёSizeOf(cbSize)=2иSizeOf(wSamplesPerBlock)=2. Тогда получится как раз 20
Trunk (2008-10-20 17:30:00) [2]> при этом chunk - 'data' совершенно не обязательно - второй,
> там еще куча информационных может быть...
Cогласен. А ещё сейчас заметил, что число 1635017060 - это ChunkID 'data'. Значит следом за ним идут 4 байта, обозначающие размер звуковых данных (DataSize). В этом случае длительность рассчитывается так:
DataSize/wfx.nAvgBytesPerSec
han_malign (2008-10-20 16:01:00) [3]+
('f', 'm', 't', ' ')
20
это Subchunk1 Size
( = sizeof(TGSM610WaveFormat) )
a
AudioFormat : Word;
NumChannels : Word;
nSamplesPerSec: Longint;
nAvgBytesPerSec : Longint;
nBlockAlign : Word;
nBitsPerSample: Word;
- это 16
при этом chunk - 'data' совершенно не обязательно - второй, там еще куча информационных может быть...
Trunk (2008-10-20 13:46:00) [4]
TGSM610WaveFormat = record
wfx: TWaveFormatEx;
wSamplesPerBlock: Word;
end;
Поэтому(#2, #0, '@', #1)расшифровывается так:
wfx.cbSize = $0002<-- это размер дополнительного поляwSamplesPerBlock
wSamplesPerBlock = $0140
А сама длительность рассчитывается так:
( RIFF_Size- 32)/wfx.nAvgBytesPerSec = (39889 - 32)/2239 = 17.8 sec
Vlad Oshin (2008-09-26 17:45:00) [5]я, конечно, мало понимаю, но
> (#2, #0,'@', #1)
это не терминатор?