Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1324104343
ШК
2011-12-17 10:45
2012.04.08
Обмен данными между приложениями через интернет


15-1323312036
Slider007
2011-12-08 06:40
2012.04.08
Поиск работы продолжается


2-1324013868
И. Павел
2011-12-16 09:37
2012.04.08
Перезапуск службы после остановки системой


2-1324135784
igorium
2011-12-17 19:29
2012.04.08
TabControl и 64-битная Windows


15-1323103260
Artem
2011-12-05 20:41
2012.04.08
О жизни





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский