Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #31  
Старый 29.08.2012, 01:35
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ночью заниматься этим лень, днём перепишу.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #32  
Старый 29.08.2012, 01:39
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от angvelem
Ночью заниматься этим лень, днём перепишу.
Разумеется, буду ждать!
Ответить с цитированием
  #33  
Старый 29.08.2012, 05:24
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Я бы хотел немного теории: в чем измеряются вот эти самые колебания wav?
Обычно в децибелах.
Цитата:
Сообщение от Dmitry_DM
И в общем: расскажите про этот график. Чем отличается график одноканального от двухканального wav?
Одноканальный - моно, двухканальный - стерео.
Цитата:
Сообщение от Dmitry_DM
И почему мы используем именно двумерный массив?
Двумерная матрица: "Количество каналов" умноженная на "Количество сэмплов в канале".
Цитата:
Сообщение от Dmitry_DM
И что за значения подразумеваются под X и Y?
Может быть всё что угодно.
Для звука, обычно по оси OX (по абсциссе) откладывается время, а по оси OY (по ординате) откладывается амплитуда звука. Я сделал небольшой пример (смотри во вложении), он рисует волну так, как на рисунке angvelem сверху. А вот снизу слева на этом рисунке, это уже амплитудно-частотный график (эквалайзер), там уже скорее всего не обошлось без быстрого преобразования Фурье. Такого я никогда не делал, так что если тебе нужен именно такой график, то прийдётся подождать когда angvelem переведёт код с ассемблера на Delphi.
Цитата:
Сообщение от Dmitry_DM
И еще: что это за цифры, по которым и строится график?
Left-0 Right-0
Left-2 Right-2
Left-7 Right-7
...
Я не знаю откуда взялись эти цифры.
Вложения
Тип файла: 7z DrawWav.7z (10.2 Кбайт, 26 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (29.08.2012)
  #34  
Старый 29.08.2012, 09:15
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от angvelem
Ночью заниматься этим лень, днём перепишу.
Тут poli-smen сделал то, что мне нужно. Конечно, если вам не захотеться переписовать код, то не надо. Я думаю это тяжелая работа. Но все же если есть желание, можете переписать. Интересна реализация еще и на TChart.А в общем спасибо всем, кто откликнулся, кто помог. Я вам очень благодарен. Без вас у меня бы и остался завал, который я бы не успел разгрести.
Ответить с цитированием
  #35  
Старый 29.08.2012, 18:40
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

вот тут все рисуется есть исходник, там и класс, обеспечивающий БПФ
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо cotseec за это полезное сообщение:
Dmitry_DM (29.08.2012), poli-smen (30.08.2012)
  #36  
Старый 29.08.2012, 20:33
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Я интегрировал пример от poli-smen в свою программу. Так сказать, удалось. Но так же, как и бар громкости (может кто помнит тему про муз. плеер), бар, который увеличивает масштаб гистограммы и волны, начинает работать при одном любом нажатии на него. Так же было и с баром громкости. Два раза совпасть не может. Это не в коде дело. Может это из-за трек бара от AlphaControl?
Ответить с цитированием
  #37  
Старый 30.08.2012, 02:33
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Обновил вложение.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #38  
Старый 30.08.2012, 20:25
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

poli-smen, я все сделал и у меня все работает, как я хотел. Но в то время пока я занимался медиаплеером и графиками, (по чистой случайности заметил), перестала работать ЗАПИСЬ нового wav. Причину я, скорее всего, вычислил. Это идентификатор NumSamples. Он стал находится в
Код:
TWavInfo = record
    WaveFormat: TWaveFormat;
    NumSamples: Integer;
    MaxAmplitude: Integer;
    Samples: packed array of array of Smallint;
end;

Я так понял это нужно для построения графика. Но перестала работать запись, просто кнопка не работает.
Я заметил в процедуре чтения эту новую строчку:
Код:
WavInfo.NumSamples := LongInt(NumSamples);
Код записи:
Код:
procedure WriteWav(const FileName: string; const WavInfo: TWavInfo);
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, I, J: Longword;
  fs: TFileStream;
begin
  NumSamples := LongInt(NumSamples); //это я изменил, думал поможет, нет!
  BytsPerSample := WavInfo.WaveFormat.wBitsPerSample div 8;
 
  Header.ChunkID := 'RIFF';
  Header.Format := 'WAVE';
  Header.Subchunk1ID := 'fmt ';
  Header.Subchunk1Size := 16;
  Header.AudioFormat := WAVE_FORMAT_PCM;
  Header.NumChannels := WavInfo.WaveFormat.nChannels;
  Header.SampleRate := WavInfo.WaveFormat.nSamplesPerSec;
  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(FileName, fmCreate);
  try
    fs.WriteBuffer(Header, SizeOf(Header));

    for I := 1 to NumSamples do
    begin
      for J := 1 to Header.NumChannels do
      begin
        fs.WriteBuffer(WavInfo.Samples[I - 1, J - 1], BytsPerSample);
      end;
    end;

  finally
    fs.Free;
  end;
end;

procedure TForm1.Button4Click{это кнопка записи}(Sender: TObject);
begin
    if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then
    begin
      if SaveDialog2.Execute then
      begin
        WriteWav(SaveDialog2.FileName, WavInfo);
      end;
    end;
end;
Как можно исправить?
А еще меня все время интересовал вопрос: что выполняет эта строчка в процедуре чтения?
Код:
SetLength(WavInfo.Samples, WavInfo.WaveFormat.nChannels, NumSamples);

Последний раз редактировалось Dmitry_DM, 30.08.2012 в 20:29.
Ответить с цитированием
  #39  
Старый 30.08.2012, 21:28
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Dmitry_DM
А еще меня все время интересовал вопрос: что выполняет эта строчка в процедуре чтения?
Код:
SetLength(WavInfo.Samples, WavInfo.WaveFormat.nChannels, NumSamples);
Всего лишь устанавливает размерность двухмерного массива WavInfo.Samples в зависимости от WavInfo.WaveFormat.nChannels и NumSamples.

P.S. Пример на Дельфи не вдохновил?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 30.08.2012 в 21:31.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Dmitry_DM (30.08.2012)
  #40  
Старый 30.08.2012, 21:34
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Может нужно
Код:
NumSamples := LongInt(WavInfo.NumSamples);
А то присваивать переменной значение самой себя очевидно неверно.
Ответить с цитированием
  #41  
Старый 31.08.2012, 02:55
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
poli-smen, я все сделал и у меня все работает, как я хотел. Но в то время пока я занимался медиаплеером и графиками, (по чистой случайности заметил), перестала работать ЗАПИСЬ нового wav. Причину я, скорее всего, вычислил. Это идентификатор NumSamples. Он стал находится в
Код:
TWavInfo = record
    WaveFormat: TWaveFormat;
    NumSamples: Integer;
    MaxAmplitude: Integer;
    Samples: packed array of array of Smallint;
end;
Я так понял это нужно для построения графика. Но перестала работать запись, просто кнопка не работает.
Я заметил в процедуре чтения эту новую строчку:
Код:
WavInfo.NumSamples := LongInt(NumSamples);
Это просто преобразование типов (так как локальная переменная NumSamples является беззнаковым целым, а поле WavInfo.NumSamples целое со знаком), но в процедуре чтения не только это изменилось.
Самое главное изменение это то, что в массиве Samples поменялись местами размерности. Это изменение связано с особенностью реализации динамических массивов в Delphi, а именно то что:
Код:
  SetLength(Samples, 10000000, 2); // такая команда съест значительно больше памяти
  SetLength(Samples, 2, 10000000); // чем такая
А так как у звукового файла количество каналов невелико (обычно 1 или 2), а сэмплов наоборот может быть довольно значительное количество, то имело смысл сделать первой размерностью именно номер канала, а не сэмпла, как было до этого. Из-за этого изменения теперь нельзя получить количество сэмплов таким образом:
Код:
  NumSamples := Length(WavInfo.Samples);
Вместо этого в структуру TWavInfo было добавлено новое поле NumSamples, которое теперь и нужно читать, чтобы узнать количество сэмплов:
Код:
  NumSamples := WavInfo.NumSamples;
Ну и конечно, в связи с изменением порядка размерностей в массиве Samples теперь к его элементам нужно обращаться "наоборот":
Код:
  // Т.е. вместо:
  fs.WriteBuffer(WavInfo.Samples[I - 1, J - 1], BytsPerSample);
  // нужно писать так:
  fs.WriteBuffer(WavInfo.Samples[J - 1, I - 1], BytsPerSample);
Кроме того, в структуру TWavInfo добавлено поле MaxAmplitude в которое процедура чтения записывает максимальное значение амплитуды звука (это значение потом используется для нормального масштабирования при прорисовке), ну и у массива Samples поменялся тип его элементов: вместо беззнакового (Word) теперь используется знаковый (Smallint) двухбайтовый тип, так как сэмплы в действительности и являются числами со знаком (по крайней мере в формате PCM это именно так).

Цитата:
Сообщение от Dmitry_DM
Код записи:
Код:
procedure WriteWav(const FileName: string; const WavInfo: TWavInfo);
...
var
  Header: THeader;
  NumSamples, BytsPerSample, I, J: Longword;
  fs: TFileStream;
begin
  NumSamples := LongInt(NumSamples); //это я изменил, думал поможет, нет!
...
Нет, эта команда тут лишена смысла.

В программе рисования звуковой волны процедура сохранения была не нужна, поэтому её я не переделывал (и не использовал), но теперь у тебя есть вся информация для её переделки.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (31.08.2012)
  #42  
Старый 31.08.2012, 11:19
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Ошибки я все исправил. Про которые вы писали. Кнопка все равно не нажимается, потому что не проходит
Код:
 if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then

Такое впечатление, что FormatTag не читается. Вроде бы все стоит на своих местах и все правильно, но не работает... Ради экономии места код сокращаю.
Код:
Код:
type
  EWavError = class(Exception);

  TWaveFormat = packed record
    wFormatTag: Word;
    nChannels: Word;
    nSamplesPerSec: DWORD;
    nAvgBytesPerSec: DWORD;
    nBlockAlign: Word;
    wBitsPerSample: Word;
  end;

  TWavInfo = record
    WaveFormat: TWaveFormat;
    NumSamples: Integer;
    MaxAmplitude: Integer;
    Samples: packed array of array of Smallint;
  end;

Const
  WAVE_FORMAT_PCM = $0001;

type
  TForm1 = class(TForm)

  private
    { Private declarations }
    FWavInfo: TWavInfo;
    procedure UpdateScrollBar;
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  WavInfo: TWavInfo;
  TxtFile : TextFile;
  t:tstringlist;
  i : integer;
  Ini:Tinifile;
  language:string;
implementation

{$R *.dfm}

{$R WindowsXP.res}

uses math, Unit2;

procedure RaiseWavError(const Msg: string);
begin
  raise EWavError.Create(Msg);
end;

procedure ClearWavInfo(var WavInfo: TWavInfo);
begin
  Finalize(WavInfo);
  FillChar(WavInfo, SizeOf(WavInfo), 0);
end;



//Процедура чтения wav 
procedure ReadWavInfo(const FileName: string; var WavInfo: TWavInfo);
type
  TChunkName = packed array[0..3] of AnsiChar;

  TRiffChunk = packed record
    RiffSign: TChunkName;
    RiffSize: Longword;
    WaveSign: TChunkName;
  end;

  TChunk = packed record
    Name: TChunkName;
    Size: Longword;
  end;

var
  fs: TFileStream;
  RiffChunk: TRiffChunk;
  Chunk: TChunk;
  FmtPos, DataPos, NewPos: Int64;
  DataSize, NumSamples, BytsPerSample, I, J, Sample: Longword;

  procedure DecRiffSize(Size: Longword);
  begin
    if RiffChunk.RiffSize < Size then RaiseWavError('Wav-файл повреждён');
    Dec(RiffChunk.RiffSize, Size);
  end;

begin
  ClearWavInfo(WavInfo);

  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  try
    fs.ReadBuffer(RiffChunk, SizeOf(RiffChunk));
    if (RiffChunk.RiffSign <> 'RIFF') or (RiffChunk.WaveSign <> 'WAVE') then RaiseWavError('Это не wav-файл');
 
    DecRiffSize(SizeOf(RiffChunk.WaveSign));

    FmtPos := 0;
    DataPos := 0;

    Form1.Memo1.Lines.Add(RiffChunk.RiffSign);
    Form1.Memo1.Lines.Add(RiffChunk.WaveSign);

    while RiffChunk.RiffSize > 0 do
    begin
      fs.ReadBuffer(Chunk, SizeOf(Chunk));
      DecRiffSize(Chunk.Size);
      DecRiffSize(SizeOf(Chunk));

      Form1.Memo1.Lines.Add(('Длина блока данных: ' + IntToStr(Chunk.Size)));

      if Chunk.Name = 'fmt ' then
      begin
        if FmtPos <> 0 then RaiseWavError('Встретилось несколько секций "fmt"');
        if Chunk.Size < SizeOf(WavInfo.WaveFormat) then RaiseWavError('Неверный размер секции "fmt"');
        FmtPos := fs.Position;
      end else
        if Chunk.Name = 'data' then
        begin
          if DataPos <> 0 then RaiseWavError('Встретилось несколько секций "data"');
          DataPos := fs.Position;
          DataSize := Chunk.Size;
        end;

      Form1.Memo1.Lines.Add(Chunk.Name);

      NewPos := fs.Position + Chunk.Size;
      fs.Position := NewPos;
      if fs.Position <> NewPos then RaiseWavError('Wav-файл повреждён');
    end;

    if FmtPos = 0 then RaiseWavError('Отсутствует секция "fmt"');

    if DataPos = 0 then RaiseWavError('Отсутствует секция "data"');

    fs.Position := FmtPos;
    fs.ReadBuffer(WavInfo.WaveFormat, SizeOf(WavInfo.WaveFormat));

    if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then
    begin
      if WavInfo.WaveFormat.nChannels = 0 then RaiseWavError('Отсутствуют каналы');

      case WavInfo.WaveFormat.wBitsPerSample of
        8: BytsPerSample := 1;
        16: BytsPerSample := 2;
      else
        RaiseWavError('Неверная разрядность сэмплов');
    end;
      BytsPerSample := WavInfo.WaveFormat.wBitsPerSample div 8;
      if BytsPerSample = 0 then RaiseWavError('Неверная разрядность сэмплов');

      NumSamples := DataSize div (BytsPerSample * WavInfo.WaveFormat.nChannels);
      if NumSamples > LongWord(MaxInt) then RaiseWavError('Слишком много сэмплов');

      SetLength(WavInfo.Samples, WavInfo.WaveFormat.nChannels, NumSamples);

      fs.Position := DataPos;
      Sample := 0;

      for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
        begin
          fs.ReadBuffer(Sample, BytsPerSample);
          case BytsPerSample of
            1: Sample := Shortint(Sample);
            2: Sample := SmallInt(Sample);
          end;
      WavInfo.Samples[J - 1, I - 1] := Sample;
      if Abs(Sample) > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Abs(Sample);
        end;
      end;
    WavInfo.NumSamples := LongInt(NumSamples);
    end;
    Form1.Edit1.Text:=Form1.OpenDialog1.FileName;
    Form1.Memo1.Lines.Add('Формат: $' + IntToHex(WavInfo.WaveFormat.wFormatTag, 4));
    Form1.Memo1.Lines.Add('Каналов: ' + IntToStr(WavInfo.WaveFormat.nChannels));
    Form1.Memo1.Lines.Add('Частота дискретизации: ' + IntToStr(WavInfo.WaveFormat.nSamplesPerSec) + ' сэмплов в секунду');
    Form1.Memo1.Lines.Add('Скорость передачи данных: ' + IntToStr(WavInfo.WaveFormat.nAvgBytesPerSec) + ' байт в секунду');
    Form1.Memo1.Lines.Add('Число байт для предоставления одного отчета: ' + IntToStr(WavInfo.WaveFormat.nBlockAlign));
    Form1.Memo1.Lines.Add('Разрядность сэмплов: ' + IntToStr(WavInfo.WaveFormat.wBitsPerSample) + ' бит');
    Form1.Memo3.Lines.Add('BytsPerSample: '+ IntToStr(BytsPerSample));
    Form1.Memo3.Lines.Add('NumSamples: ' + IntToStr(WavInfo.NumSamples));
  finally
    fs.Free;
  end;
end;

//Процедура открытия wav, построения графика
procedure  TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  if OpenDialog1.Execute then

begin
   MediaPlayer1.FileName:=OpenDialog1.FileName;
   MediaPlayer1.Open;
   MediaPlayer1.Play;
   LengthBar.Max:=MediaPlayer1.Length;
   LengthBar.Min:=MediaPlayer1.StartPos;
   Timer1.Enabled:=True;
end;

  begin
    ClearWavInfo(FWavInfo);
    tcDrawWav.Tabs.Clear;
    pbDrawWav.Invalidate;
    try
      ReadWavInfo(OpenDialog1.FileName, FWavInfo);
    except
      ClearWavInfo(FWavInfo);
      raise;
    end;

    sbTimePos.Position := sbTimePos.Min;
    sbTimePos.PageSize := 0;
    sbTimePos.Max := Max(FWavInfo.NumSamples + sbTimePos.Min - 1, sbTimePos.Min);
    sbTimePos.PageSize := FWavInfo.NumSamples div tbTime.Position;

    for i := 1 to FWavInfo.WaveFormat.nChannels do
    begin
      tcDrawWav.Tabs.Add('Channel №' + IntToStr(i));
    end;

    pbDrawWav.Invalidate;
  end;
end;




//Процедура записи
procedure WriteWav(const FileName: string; const WavInfo: TWavInfo);
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, I, J: Longword;
  fs: TFileStream;
begin
  NumSamples := WavInfo.NumSamples;
  BytsPerSample := WavInfo.WaveFormat.wBitsPerSample div 8;

  Header.ChunkID := 'RIFF';
  Header.Format := 'WAVE';
  Header.Subchunk1ID := 'fmt ';
  Header.Subchunk1Size := 16;
  Header.AudioFormat := WAVE_FORMAT_PCM;
  Header.NumChannels := WavInfo.WaveFormat.nChannels;
  Header.SampleRate := WavInfo.WaveFormat.nSamplesPerSec;
  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(FileName, fmCreate);
  try
    fs.WriteBuffer(Header, SizeOf(Header));

    for I := 1 to NumSamples do
    begin
      for J := 1 to Header.NumChannels do
      begin
        fs.WriteBuffer(WavInfo.Samples[J - 1, I - 1], BytsPerSample);
      end;
    end;

  finally
    fs.Free;
  end;
end;

//Кнопка записи
procedure TForm1.Button4Click(Sender: TObject);
begin
    if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then
    begin
      if SaveDialog2.Execute then
      begin
        WriteWav(SaveDialog2.FileName, WavInfo);
      end;
    end;
end;
Ответить с цитированием
  #43  
Старый 31.08.2012, 11:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Ошибки я все исправил. Про которые вы писали. Кнопка все равно не нажимается, потому что не проходит
Код:
 if WavInfo.WaveFormat.wFormatTag = WAVE_FORMAT_PCM then

Такое впечатление, что FormatTag не читается. Вроде бы все стоит на своих местах и все правильно, но не работает...
Здесь опять старая проблема: кнопка Button1Click читает данные в одно место, а кнопка Button4Click пытается прочитать их из другого места.
Ответить с цитированием
  #44  
Старый 31.08.2012, 11:34
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Здесь опять старая проблема: кнопка Button1Click читает данные в одно место, а кнопка Button4Click пытается прочитать их из другого места.
Всмысле? Кнопка4, она вообще не читает, она просто записывает массив .
Ответить с цитированием
  #45  
Старый 31.08.2012, 11:36
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Всмысле? Кнопка4, она вообще не читает, она просто записывает массив .
Какой массив?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter