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

Цитата:
Сообщение от Dmitry_DM
Ну я серьезно! Метод заключается в приведение файла из относительного в абсолютное частотное звучание, таким образом файл будет не просто под паролем и целый себе, а иметь ровную линию частоты, типа "шшшшшш" или "пииии", а потом адресат звукового сообщения сможет восстановить целостность и спокойно услышать информацию. Но для реализации плана мне нужна ваша помощь! Как создать wav файл, используя данные, которые я, благодаря вам, могу читать?
Вот наваял (не проверял, но должно работать):
Код:
procedure WriteWav();
type
  TChunkID = packed array [0..3] of Char;

  THeader = packed record
    ChunkID       : TChunkID;
    ChunkSize     : Longword;
    Format        : TChunkID;
    Subchunk1ID   : TChunkID;
    Subchunk1Size : Longword;
    AudioFormat   : Word;
    NumChannels   : Word;
    SampleRate    : Longword;
    ByteRate      : Longword;
    BlockAlign    : Word;
    BitsPerSample : Word;
    Subchunk2ID   : TChunkID;
    Subchunk2Size : Longword;
  end;

var
  Header: THeader;
  NumSamples, BytsPerSample, Sample, I, J: Longword;
  fs: TFileStream;
begin
  NumSamples := ;// Здесь записываешь количество сэмплов у твоего звука

  BytsPerSample := 2; // Размер сэмплов в байтах твоего звука. Обычно 1 или 2, но можно и 3 и 4.

  Header.ChunkID       := 'RIFF';
  Header.Format        := 'WAVE';
  Header.Subchunk1ID   := 'fmt ';
  Header.Subchunk1Size := 16;
  Header.AudioFormat   := $0001; // Только PCM
  Header.NumChannels   := ;// Здесь записываешь число каналов своего звука. 1 - моно, 2 - стерео и т.д.
  Header.SampleRate    := ;// Здесь записываешь частоту дискретизации своего звука. Типа 8000, 44100 и т.п.
  Header.BitsPerSample := BytsPerSample * 8;
  Header.BlockAlign    := Header.NumChannels * BytsPerSample;
  Header.ByteRate      := Header.SampleRate * Header.BlockAlign;
  Header.Subchunk2ID   := 'data';
  Header.Subchunk2Size := NumSamples * Header.BlockAlign;
  Header.ChunkSize     := Header.Subchunk2Size + SizeOf(Header) - 8;

  fs := TFileStream.Create(Имя файла в который выводить, fmCreate);
  try
    fs.WriteBuffer(Header, SizeOf(Header));
      
    for I := 1 to NumSamples do
    begin
      for J := 1 to Header.NumChannels do
      begin
        Sample := ;{ Здесь читаешь очередной сэмпл оттуда, куда их записывал
                     твой конвертор "из относительного в абсолютное частотное звучание"}
        fs.WriteBuffer(Sample, BytsPerSample);
      end;
    end;

  finally
    fs.Free;
  end;
end;
Ответить с цитированием