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

Delphi Sources



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

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

Цитата:
Сообщение от Dmitry_DM
Это я понимаю, я про процедуру записи. Там стоит NumSamples:=1079; (просто так выбрал число). Что туда присваивать, что бы было так же как 1079, но уже само менялось, в зависимости от файла.
Как что? То что прочиталось в процедуре чтения здесь:
Код:
...
NumSamples := wChankSize div (SampleSize * Header.wChannels);
...
Ответить с цитированием
  #92  
Старый 16.08.2012, 12:02
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Как что? То что прочиталось в процедуре чтения здесь:
Код:
...
NumSamples := wChankSize div (SampleSize * Header.wChannels);
...
Вот процедура чтения:
Код:
procedure WriteWav(const FileName: String);
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;
    wChannels     : WORD;
  end;
var
  Header: THeader;
  NumSamples, BytsPerSample, Sample, I, J: Longword;
  fs: TFileStream;
  wChankSize    : Cardinal;

begin
  NumSamples := wChankSize div (SampleSize * Header.wChannels);
  BytsPerSample := 2;

  Header.ChunkID       := 'RIFF';
  Header.ChunkSize     := StrToInt(Form1.Memo2.Lines[1]);
  Header.Format        := 'WAVE';
  Header.Subchunk1ID   := 'fmt ';
  Header.Subchunk1Size := StrToInt(Form1.Memo2.Lines[4]);
  Header.AudioFormat   := $0001;
  Header.NumChannels   := StrToInt(Form1.Memo2.Lines[6]);
  Header.SampleRate    := StrToInt(Form1.Memo2.Lines[7]);
  Header.ByteRate      := StrToInt(Form1.Memo2.Lines[8]);
  Header.BlockAlign    := StrToInt(Form1.Memo2.Lines[9]);
  Header.BitsPerSample := StrToInt(Form1.Memo2.Lines[10]);
  Header.Subchunk2ID   := 'data';
  Header.Subchunk2Size := StrToInt(Form1.Memo2.Lines[12]);
  fs := TFileStream.Create('New File.wav',fmCreate);
  try
    fs.WriteBuffer(Header, SizeOf(Header));
      for I := 1 to NumSamples do
    begin
      for J := 1 to Header.NumChannels do
      begin
        Sample := 1111;
        fs.WriteBuffer(Sample, BytsPerSample);
      end;
    end;
  finally
    fs.Free;
  end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
  if SaveDialog2.Execute then
  begin
    WriteWav(SaveDialog2.FileName);
  end;
  end;
end.
Выдает ошибку "Division by zero". Что делать?
Ответить с цитированием
  #93  
Старый 16.08.2012, 12:38
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Вот процедура чтения:
...
Выдает ошибку "Division by zero". Что делать?
Нет. Это я процитировал строчку из функции чтения:
Код:
...
NumSamples := wChankSize div (SampleSize * Header.wChannels);
...
Теперь значение NumSamples нужно просто передать функции записи.
Ответить с цитированием
  #94  
Старый 16.08.2012, 12:49
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Нет. Это я процитировал строчку из функции чтения:
Код:
...
NumSamples := wChankSize div (SampleSize * Header.wChannels);
...
Теперь значение NumSamples нужно просто передать функции записи.
Каким образом?
Ответить с цитированием
  #95  
Старый 16.08.2012, 13:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Каким образом?
А каким образом обычно в функции и процедуры передаются параметры?
Ответить с цитированием
  #96  
Старый 16.08.2012, 13:22
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

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

Цитата:
Сообщение от Dmitry_DM
В скобках, но хотелось бы по конкретнее, что бы правильно было.
А как тут можно сделать неправильно? Это нужно сильно постараться, чтобы сделать неправильно...
Ответить с цитированием
  #98  
Старый 16.08.2012, 13:30
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
А как тут можно сделать неправильно? Это нужно сильно постараться, чтобы сделать неправильно...
Хорошо. Если Sample записывается так:
Код:
begin
Sample := 1111;
fs.WriteBuffer(Sample, BytsPerSample);
end;
Значит NumSamples надо записывать так?:
Код:
begin
fs.WriteBuffer(NumSamples);
Правильно?
Ответить с цитированием
  #99  
Старый 16.08.2012, 14:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Хорошо. Если Sample записывается так:
Код:
begin
Sample := 1111;
fs.WriteBuffer(Sample, BytsPerSample);
end;
А почему "Sample записывается так"? Там что, звук состоит из одного и того же значения сэмпла? Тогда можно и не читать ничего.
Цитата:
Сообщение от Dmitry_DM
Значит NumSamples надо записывать так?:
Код:
begin
fs.WriteBuffer(NumSamples);
Правильно?
А зачем NumSamples записывать в выходной wav-файл? Я так понял, что NumSamples нужно передать в функцию записи, чтобы она знала сколько сэмплов нужно записывать?
Ответить с цитированием
  #100  
Старый 16.08.2012, 14:32
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
А почему "Sample записывается так"? Там что, звук состоит из одного и того же значения сэмпла? Тогда можно и не читать ничего.

А зачем NumSamples записывать в выходной wav-файл? Я так понял, что NumSamples нужно передать в функцию записи, чтобы она знала сколько сэмплов нужно записывать?
Именно! Как это сделать? Чему присвоить NumSamples?
Код:
NumSamples := ???????
Ответить с цитированием
  #101  
Старый 16.08.2012, 14:36
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
А почему "Sample записывается так"? Там что, звук состоит из одного и того же значения сэмпла? Тогда можно и не читать ничего.
То я для примера. А как сделать, что присвоить семплам? Я не знаю. Что я не пытался - ошибки компилятора, или огромные файлы на выходе.
Ответить с цитированием
  #102  
Старый 16.08.2012, 14:48
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Именно! Как это сделать? Чему присвоить NumSamples?
Код:
NumSamples := ???????
А зачем её присваивать? Её нужно передать как параметр в процедуру WriteWav.
Ответить с цитированием
  #103  
Старый 16.08.2012, 14:54
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
А зачем её присваивать? Её нужно передать как параметр в процедуру WriteWav.
Передал.. Вроде работает, но значения не те: выводит D174, NumSampl'ное количество раз.
Стоп! Что-то я не то сделал. Я убрал Sample:= 1111, и стало по вышеописанному, а что, NumSamples передать уже третьим в процедуру WriteWav?
Там уже и так
Код:
fs.WriteBuffer(Sample, BytsPerSample);

Последний раз редактировалось Dmitry_DM, 16.08.2012 в 15:08.
Ответить с цитированием
  #104  
Старый 16.08.2012, 15:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Передал.. Вроде работает, но значения не те: выводит D174, NumSampl'ное количество раз.
Значит нужно вместо константы, записывать реально прочитанные данные.
Ответить с цитированием
  #105  
Старый 16.08.2012, 15:10
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Значит нужно вместо константы, записывать реально прочитанные данные.
Это как? Как сделать?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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