Показать сообщение отдельно
  #23  
Старый 10.08.2012, 11:50
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Вот наваял пример (будешь должен ):
Код:
var
...
  sample: Int64;
  SampleSize, chanel, n, i: Integer;
  s: String;
...
    if Header.wFormatTag<>1 then
    begin
      Form1.Memo1.Lines.Add('ОШИБКА! Я умею читать wav-файлы только в формате PCM, а этот файл в формате 0x'+IntToHex(Header.wFormatTag, 4));
      // Можешь вместо числового значения выдавать текстом взятым например отсюда: http://wiki.multimedia.cx/index.php?title=TwoCC
      Exit;
    end;

    SampleSize:=(Header.wBitsPerSample+7) div 8;
    if SampleSize>SizeOf(sample) then
    begin
      Form1.Memo1.Lines.Add('ОШИБКА! Слишком большой размер сэмпла ('+IntToStr(SampleSize)+' байт)');
      Exit;
    end;

    if Header.wChannels=0 then
    begin
      Form1.Memo1.Lines.Add('ОШИБКА! Нет каналов');
      Exit;
    end;

    Form1.Memo1.WordWrap:=False;
    Form1.Memo1.ScrollBars:=ssBoth;
    sample:=0;
    i:=0;
    while wChankSize>=(SampleSize*Header.wChannels) do
    begin
      if Header.wBlockAlign>0 then
      begin
        n:=f.Position mod Header.wBlockAlign;
        if n>0 then
        begin
          f.Seek(wChankSize, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize<(SampleSize*Header.wChannels) then Break;
        end;
      end;

      Inc(i);
      s:='Сэмпл '+IntToStr(i);
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        Dec(wChankSize, SampleSize);
        s:=s+', Канал '+IntToStr(chanel)+': '+IntToHex(sample, SampleSize*2);
      end;
      Form1.Memo1.Lines.Add(s);
    end;
Писал на скорую руку - могут быть ошибки, так что проверяй.
Если и после этого тебе будет не ясно как читать PCM-сэмплы - убью
Ответить с цитированием