Конференция "Media" » Формат WAV GSM 6.10 Определить длительность звучания [D6, Win2k]
 
  • M3 (26.09.08 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 © (26.09.08 17:45) [1]
    я, конечно, мало понимаю, но

    > (#2, #0, '@', #1)

    это не терминатор?
  • Trunk © (20.10.08 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 © (20.10.08 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 © (20.10.08 17:30) [4]
    > при этом chunk - 'data' совершенно не обязательно - второй,
    >  там еще куча информационных может быть...


    Cогласен. А ещё сейчас заметил, что  число 1635017060 - это ChunkID 'data'. Значит следом за ним идут 4 байта, обозначающие размер звуковых данных (DataSize). В этом случае длительность рассчитывается так:
    DataSize/wfx.nAvgBytesPerSec

  • Trunk © (20.10.08 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
 
Конференция "Media" » Формат WAV GSM 6.10 Определить длительность звучания [D6, Win2k]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]