Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Формат 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)

это не терминатор?


Наверх

Титульная страница Поиск, карта сайта Написать письмо