-
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); не подходят в данном случае ???
-
я, конечно, мало понимаю, но
> (#2, #0, '@', #1)
это не терминатор?
-
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
-
+ ('f', 'm', 't', ' ') 20 это Subchunk1Size ( = sizeof(TGSM610WaveFormat) ) a AudioFormat : Word; NumChannels : Word; nSamplesPerSec: Longint; nAvgBytesPerSec : Longint; nBlockAlign : Word; nBitsPerSample: Word; - это 16
при этом chunk - 'data' совершенно не обязательно - второй, там еще куча информационных может быть...
-
> при этом chunk - 'data' совершенно не обязательно - второй, > там еще куча информационных может быть...Cогласен. А ещё сейчас заметил, что число 1635017060 - это ChunkID 'data'. Значит следом за ним идут 4 байта, обозначающие размер звуковых данных (DataSize). В этом случае длительность рассчитывается так: DataSize/wfx.nAvgBytesPerSec
-
> a > AudioFormat : Word; > NumChannels : Word; > nSamplesPerSec: Longint; > nAvgBytesPerSec : Longint; > nBlockAlign : Word; > nBitsPerSample: Word; > - это 16К этим 16 нужно добавить ещё SizeOf(cbSize)=2 и SizeOf(wSamplesPerBlock)=2 . Тогда получится как раз 20
|