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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #31  
Старый 10.08.2012, 14:45
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Хм... Интересно ты программы пишешь...
Кстати пару ошибок я таки нашёл. Правда они редко будут проявляться, может даже почти никогда, но всё-же лучше без них
Вот здесь:
Код:
        if n>0 then
        begin
          f.Seek(wChankSize, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize<(SampleSize*Header.wChannels) then Break;
        end;
Должно быть так:
Код:
        if n>0 then
        begin
          n:=Header.wBlockAlign-n;
          f.Seek(n, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize<(SampleSize*Header.wChannels) then Break;
        end;
Теперь у меня с считыванием все в порядке! Спасибо! Хочу спросить: а можно ли как-то создать wav используя данные из Memo1 моей программы?
Ответить с цитированием
  #32  
Старый 10.08.2012, 15:11
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Теперь у меня с считыванием все в порядке! Спасибо! Хочу спросить: а можно ли как-то создать wav используя данные из Memo1 моей программы?
А какие данные у тебя в Memo1? Неужто звук в формате PCM?
Ответить с цитированием
  #33  
Старый 10.08.2012, 15:37
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
А какие данные у тебя в Memo1? Неужто звук в формате PCM?
Как какие? Заголовок wav и его данные.
Ответить с цитированием
  #34  
Старый 10.08.2012, 16:02
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Как какие? Заголовок wav и его данные.
Это что-ли те которые недавно выводили в Memo1?
Можно конечно, но сложно. Ведь те данные оформлены для чтения человеком. А обычно чем лучше что-то читается человеком, тем хуже это получается у программ. И наоборот.
Ответить с цитированием
  #35  
Старый 11.08.2012, 19:28
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Это что-ли те которые недавно выводили в Memo1?
Можно конечно, но сложно. Ведь те данные оформлены для чтения человеком. А обычно чем лучше что-то читается человеком, тем хуже это получается у программ. И наоборот.
Ну а вообще каким образом можно создать программно wav файл, в каком формате должны быть представлены данные, для создания? Как это можно сделать? Мне это не меньше будет надо, после того, как я закончу колдовать над данными. И еще я хочу рассказать немного о моем проекте: значит я шифрую wav файл так, что его нельзя будет прослушать, допустим в нем содержалось сверхсекретная голосовая запись, потом его отправляю другому человеку на другой комп и он должен расшифровать этот файл, что бы узнать содержание. И расшифровать его может только он, зная секрет шифрования. Так я хочу создать новый защищенный метод передачи секретной информации. Подробности все сейчас не расскажу, а буду по ходу прогресса у вас консультироваться.
Ответить с цитированием
  #36  
Старый 11.08.2012, 20:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Ну а вообще каким образом можно создать программно wav файл, в каком формате должны быть представлены данные, для создания? Как это можно сделать? Мне это не меньше будет надо, после того, как я закончу колдовать над данными. И еще я хочу рассказать немного о моем проекте: значит я шифрую wav файл так, что его нельзя будет прослушать, допустим в нем содержалось сверхсекретная голосовая запись, потом его отправляю другому человеку на другой комп и он должен расшифровать этот файл, что бы узнать содержание. И расшифровать его может только он, зная секрет шифрования. Так я хочу создать новый защищенный метод передачи секретной информации. Подробности все сейчас не расскажу, а буду по ходу прогресса у вас консультироваться.
А зачем тебе тогда нужно знание формата wav-файла? Просто шифруй весь файл не разбираясь что там внутри него. Например можно зашифровать архиваторами WinRar или 7-zip - если пароль длинный из случайных символов, то расшифровать такой файл практически невозможно.
Ну а если хочешь чтобы твоя программа не зависела от сторонних утилит, то тебе нужно изучать алгоритмы шифрования, а вовсе не структуру wav-файла.
Если же хочешь изобрести свой алгоритм шифрования, то готовься к тому, что он скорее всего окажется не такой стойкий к взлому как общепринятые алгоритмы.
Ответить с цитированием
  #37  
Старый 11.08.2012, 23:45
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
А зачем тебе тогда нужно знание формата wav-файла? Просто шифруй весь файл не разбираясь что там внутри него. Например можно зашифровать архиваторами WinRar или 7-zip - если пароль длинный из случайных символов, то расшифровать такой файл практически невозможно.
Ну а если хочешь чтобы твоя программа не зависела от сторонних утилит, то тебе нужно изучать алгоритмы шифрования, а вовсе не структуру wav-файла.
Если же хочешь изобрести свой алгоритм шифрования, то готовься к тому, что он скорее всего окажется не такой стойкий к взлому как общепринятые алгоритмы.
Я делаю научную работу, поэтому у меня есть чёткий план и чёткий алгоритм. И я уверен в 100% надежности моего метода шифрования. И еще такое: что такое значение оординат wav файла и как их найти с помощью делфи?
Ответить с цитированием
  #38  
Старый 12.08.2012, 00:48
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Dmitry_DM
... И я уверен в 100% надежности моего метода шифрования...
Мдя, уверенность хорошо, но как-то наивно.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #39  
Старый 12.08.2012, 02:05
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от angvelem
Мдя, уверенность хорошо, но как-то наивно.
Ну я серьезно! Метод заключается в приведение файла из относительного в абсолютное частотное звучание, таким образом файл будет не просто под паролем и целый себе, а иметь ровную линию частоты, типа "шшшшшш" или "пииии", а потом адресат звукового сообщения сможет восстановить целостность и спокойно услышать информацию. Но для реализации плана мне нужна ваша помощь! Как создать wav файл, используя данные, которые я, благодаря вам, могу читать?
Ответить с цитированием
  #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;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (12.08.2012)
  #41  
Старый 12.08.2012, 13:44
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Вот наваял (не проверял, но должно работать):
Код:
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;
Это очень даже неплохо! Должно работать, но есть некие вопросы: для начала хочу спросить чего не хватает, чтобы файл создавался сохранением через SaveDialog2, который я кинул на форму, а SaveDialog2 вызывался нажатием Button4Click, которую я тоже кинул на форму? Ну и второй вопрос содержится в коде (строка 58)
Код:
procedure TForm1.Button4Click(Sender: TObject);


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 := 22050;// Здесь записываешь количество сэмплов у твоего звука

  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;// Здесь записываешь число каналов своего звука. 1 - моно, 2 - стерео и т.д.
  Header.SampleRate    := 44100;// Здесь записываешь частоту дискретизации своего звука. Типа 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('Writen.wav', 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);

if SaveDialog2.Execute then
Form1.fs.SaveToFile(Form1.SaveDialog2.FileName + '.wav');

   fs.Free;
  end;
  end;
  finally
  end;
  end;
end.
Ответить с цитированием
  #42  
Старый 12.08.2012, 14:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Это очень даже неплохо! Должно работать, но есть некие вопросы: для начала хочу спросить чего не хватает, чтобы файл создавался сохранением через SaveDialog2, который я кинул на форму, а SaveDialog2 вызывался нажатием Button4Click, которую я тоже кинул на форму? Ну и второй вопрос содержится в коде (строка 58)
Код:
 //fs := TFileStream.Create('Writen.wav', fmCreate);
  try
    fs.WriteBuffer(Header, SizeOf(Header));
Это ты что, закомментировал создание объекта и тут же пытаешься работать с этим несозданным объектом???

Цитата:
Сообщение от Dmitry_DM
Код:
        Sample := что сюда записать, чтобы для начала и для моего понимания, в файл шли теперешние сэмплы (не измененные)?
Так откуда же я знаю куда ты записывал "теперешние сэмплы"? Куда записывал оттуда и считывай. Я рекомендую записывать в массив, тогда считываешь так:
Код:
        Sample := Massiv[I, J];

Цитата:
Сообщение от Dmitry_DM
Код:
if SaveDialog2.Execute then
Form1.fs.SaveToFile(Form1.SaveDialog2.FileName + '.wav');
Это уже совсем не в ту степь влезло. Делай так:
Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
  if SaveDialog2.Execute then
  begin
    WriteWav(SaveDialog2.FileName);
  end;
end;
Ну и соответственно в процедуру WriteWav добавь параметр для имени файла, который будешь использовать при создании потока TFileStream.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Dmitry_DM (12.08.2012)
  #43  
Старый 12.08.2012, 14:58
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Так откуда же я знаю куда ты записывал "теперешние сэмплы"? Куда записывал оттуда и считывай. Я рекомендую записывать в массив, тогда считываешь так:
Код:
        Sample := Massiv[I, J];
А перед этим выполнить операцию „Запись буфера в массив”? Правильно?
Ответить с цитированием
  #44  
Старый 12.08.2012, 15:19
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
А перед этим выполнить операцию „Запись буфера в массив”? Правильно?
Совершенно верно
Ответить с цитированием
  #45  
Старый 12.08.2012, 16:04
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Совершенно верно
Странно, но я не могу найти как записать буфер в массив. Когда-то видел статью, но не помню по какому запросу. Не подскажите как сделать эту операцию?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter