Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.08;
Скачать: CL | DM;

Вниз

Формат 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 вся ветка

Текущий архив: 2012.04.08;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
1-1291060700
flexo911
2010-11-29 22:58
2012.04.08
Предложения


15-1323404238
vajo
2011-12-09 08:17
2012.04.08
Удаленный рабочий стол


6-1254688951
xarfan
2009-10-05 00:42
2012.04.08
Идентификация пользователей при работе с Сокетами (Delphi)


15-1323102788
Eraser
2011-12-05 20:33
2012.04.08
Какой хостинг посоветуете?


2-1323956306
Besonder
2011-12-15 17:38
2012.04.08
HTTP connection