Форум: "Media";
Текущий архив: 2012.04.08;
Скачать: [xml.tar.bz2];
ВнизФормат WAV GSM 6.10 Определить длительность звучания Найти похожие ветки
← →
M3 (2008-09-26 14:41) [0]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);
не подходят в данном случае ???
← →
Vlad Oshin © (2008-09-26 17:45) [1]я, конечно, мало понимаю, но
> (#2, #0, "@", #1)
это не терминатор?
← →
Trunk © (2008-10-20 13:46) [2]
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
← →
han_malign © (2008-10-20 16:01) [3]+
("f", "m", "t", " ")
20
это Subchunk1Size
( = sizeof(TGSM610WaveFormat) )
a
AudioFormat : Word;
NumChannels : Word;
nSamplesPerSec: Longint;
nAvgBytesPerSec : Longint;
nBlockAlign : Word;
nBitsPerSample: Word;
- это 16
при этом chunk - "data" совершенно не обязательно - второй, там еще куча информационных может быть...
← →
Trunk © (2008-10-20 17:30) [4]> при этом chunk - "data" совершенно не обязательно - второй,
> там еще куча информационных может быть...
Cогласен. А ещё сейчас заметил, что число 1635017060 - это ChunkID "data". Значит следом за ним идут 4 байта, обозначающие размер звуковых данных (DataSize). В этом случае длительность рассчитывается так:DataSize/wfx.nAvgBytesPerSec
← →
Trunk © (2008-10-20 17:35) [5]> a
> AudioFormat : Word;
> NumChannels : Word;
> nSamplesPerSec: Longint;
> nAvgBytesPerSec : Longint;
> nBlockAlign : Word;
> nBitsPerSample: Word;
> - это 16
К этим 16 нужно добавить ещёSizeOf(cbSize)=2
иSizeOf(wSamplesPerBlock)=2
. Тогда получится как раз 20
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2012.04.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c