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

Delphi Sources



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

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

Цитата:
Сообщение от poli-smen
Не структуру result, а структуру TWaveResult.
Дополнять нужно теми параметрами, которые можно прочитать из wav-файла в функции ReadWave, и которые нужно потом передать в процедуру WriteWav.
Хорошо, попробую разобраться. К стати, я вручную создал wav, как я называю с „перевернутыми” данными, так вот: все же это проблема, звук получаться не прям другой, но немного отличается, какой то глухой и усиленный, так что подскажите решение этой проблемы!
Ответить с цитированием
  #77  
Старый 15.08.2012, 12:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Хорошо, попробую разобраться. К стати, я вручную создал wav, как я называю с „перевернутыми” данными, так вот: все же это проблема, звук получаться не прям другой, но немного отличается, какой то глухой и усиленный, так что подскажите решение этой проблемы!
Значит, что-то неправильно сделали. В любом wav-файле (с аудио-PCM) сэмплы хранятся в перевёрнутом виде (и это видно в любом hex-просмотрщике). Если их прочитать как целые числа они "автоматом переворачиваются" и отображаются правильно. Если эти числа опять записать в wav-файл они опять "перевернутся" и всё равно будут храниться в перевёрнутом виде.
И почитайте об этом хотя бы здесь: http://ru.wikipedia.org/wiki/Little-endian
Ответить с цитированием
  #78  
Старый 15.08.2012, 13:31
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Значит, что-то неправильно сделали. В любом wav-файле (с аудио-PCM) сэмплы хранятся в перевёрнутом виде (и это видно в любом hex-просмотрщике). Если их прочитать как целые числа они "автоматом переворачиваются" и отображаются правильно. Если эти числа опять записать в wav-файл они опять "перевернутся" и всё равно будут храниться в перевёрнутом виде.
И почитайте об этом хотя бы здесь: http://ru.wikipedia.org/wiki/Little-endian
Наверное, если бы данные именно записывались, они бы перевернулись и было бы все правильно, но я не записывал, а просто вставил выводимые данные в HEX редакторе такими, какие они есть. То есть при "настоящей" записи они перевернуться и будет все нормально.
Ответить с цитированием
  #79  
Старый 15.08.2012, 13:37
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Наверное, если бы данные именно записывались, они бы перевернулись и было бы все правильно, но я не записывал, а просто вставил выводимые данные в HEX редакторе такими, какие они есть. То есть при "настоящей" записи они перевернуться и будет все нормально.
Вот и ответ почему "звук получаться не прям другой, но немного отличается".
Ответить с цитированием
  #80  
Старый 15.08.2012, 14:28
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Я сейчас нашел способ автоматического ввода, пока что NumSamples. Сделал я это так:
Код:
s2:=i;
s:=IntToStr(s2);
Form1.Memo1.Lines.Add(s);
И выводит: (пример memo)
1
FFFA
2
000A
3
FFEE
4
0025
5
FE90
...
1075
000A
1076
001A
1077
000A
1078
000C
1079
FFFE
Теперь вопрос: как вывести максимальное значение (i)? (В данном случае 1079). Мне кажется так можно надежно получить NumSamples
На выводе написать:
Код:
NumSamples := s;  
И все дела!
Ответить с цитированием
  #81  
Старый 15.08.2012, 14:36
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Я сейчас нашел способ автоматического ввода, пока что NumSamples. Сделал я это так:
Код:
s2:=i;
s:=IntToStr(s2);
Form1.Memo1.Lines.Add(s);
И выводит: (пример memo)
1
FFFA
2
000A
3
FFEE
4
0025
5
FE90
...
1075
000A
1076
001A
1077
000A
1078
000C
1079
FFFE
Теперь вопрос: как вывести максимальное значение (i)? (В данном случае 1079). Мне кажется так можно надежно получить NumSamples
На выводе написать:
Код:
NumSamples := s;  
И все дела!
Та оно уже выводится. Самое последнее (точнее предпоследнее).
Ответить с цитированием
  #82  
Старый 15.08.2012, 14:40
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Та оно уже выводится. Самое последнее (точнее предпоследнее).
Так s - это все числа, а мне нужно Max(s). Как-то так. Как мне присвоить s только последний номер семпла. Тогда процедура Write Wave будет знать сколько всего сэмплов.
Ответить с цитированием
  #83  
Старый 15.08.2012, 15:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Так s - это все числа, а мне нужно Max(s). Как-то так. Как мне присвоить s только последний номер семпла. Тогда процедура Write Wave будет знать сколько всего сэмплов.
s - это строковая переменная. Какие в ней могут быть "все числа"?
Ответить с цитированием
  #84  
Старый 15.08.2012, 15:53
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
s - это строковая переменная. Какие в ней могут быть "все числа"?
Ну хорошо, и как мне тогда сделать, что бы NumSamples записывало кол. сэмплов всего ? Если мой метод не правильный..
Ответить с цитированием
  #85  
Старый 15.08.2012, 16:12
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Ну хорошо, и как мне тогда сделать, что бы NumSamples записывало кол. сэмплов всего ? Если мой метод не правильный..
Конечное значение переменной i это и будет количество прочитанных сэмплов, т.е. NumSamples.
Ответить с цитированием
  #86  
Старый 15.08.2012, 18:46
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Конечное значение переменной i это и будет количество прочитанных сэмплов, т.е. NumSamples.
Боже! У меня не чего не выходит. Ставлю
Код:
NumSamples:= i;
Получается файл 27 Мб!!! Ставлю
Код:
Inc(i);
s2:=i;
Потом при записи ставлю
Код:
NumSamples:= s2;

Получается файл 44 byte!!! Без сэмплов и с 2 строчками заголовка. Что делать - НЕ ЗНАЮ Пожалуйста, ПОМОГИТЕ!!!!
Ответить с цитированием
  #87  
Старый 15.08.2012, 21:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Боже! У меня не чего не выходит. Ставлю
Код:
NumSamples:= i;
Получается файл 27 Мб!!! Ставлю
Код:
Inc(i);
s2:=i;
Потом при записи ставлю
Код:
NumSamples:= s2;

Получается файл 44 byte!!! Без сэмплов и с 2 строчками заголовка. Что делать - НЕ ЗНАЮ Пожалуйста, ПОМОГИТЕ!!!!
Конечное значение переменной i это и будет количество прочитанных сэмплов, т.е. NumSamples.
В каком месте вы считываете конечное значение переменной i? Считывать её нужно в конце этого цикла:
Код:
    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
          n := Header.wBlockAlign - n;
          f.Seek(n, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize < (SampleSize * Header.wChannels) then Break;
        end;
      end;

      Inc(i);
      s1 := '';
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        Dec(wChankSize, SampleSize);
        s1 := s1 + IntToHex(sample, SampleSize * 2);
      end;
      Form1.Memo1.Lines.Add(s1);
    end;
    exit;
Как раз вместо слова exit. Кстати что это за exit? Откуда он тут взялся? Его здесь быть не должно.

А вот если ещё почитать внимательно справку здесь, то для звука в формате PCM вышеприведённый цикл можно значительно упростить:
Код:
    sample := 0;
    NumSamples := wChankSize div (SampleSize * Header.wChannels);
    for i := 1 to NumSamples do
    begin
      s1 := '';
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        s1 := s1 + IntToHex(sample, SampleSize * 2);
      end;
      Form1.Memo1.Lines.Add(s1);
    end;
Ответить с цитированием
  #88  
Старый 15.08.2012, 23:45
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Конечное значение переменной i это и будет количество прочитанных сэмплов, т.е. NumSamples.
В каком месте вы считываете конечное значение переменной i? Считывать её нужно в конце этого цикла:
Код:
    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
          n := Header.wBlockAlign - n;
          f.Seek(n, soFromCurrent);
          Dec(wChankSize, n);
          if wChankSize < (SampleSize * Header.wChannels) then Break;
        end;
      end;

      Inc(i);
      s1 := '';
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        Dec(wChankSize, SampleSize);
        s1 := s1 + IntToHex(sample, SampleSize * 2);
      end;
      Form1.Memo1.Lines.Add(s1);
    end;
    exit;
Как раз вместо слова exit. Кстати что это за exit? Откуда он тут взялся? Его здесь быть не должно.

А вот если ещё почитать внимательно справку здесь, то для звука в формате PCM вышеприведённый цикл можно значительно упростить:
Код:
    sample := 0;
    NumSamples := wChankSize div (SampleSize * Header.wChannels);
    for i := 1 to NumSamples do
    begin
      s1 := '';
      for chanel := 1 to Header.wChannels do
      begin
        f.ReadBuffer(sample, SampleSize);
        s1 := s1 + IntToHex(sample, SampleSize * 2);
      end;
      Form1.Memo1.Lines.Add(s1);
    end;
А каким кодом правильнее всего считать I? Что бы уже точно правильно было. Может так:
Код:
s2:=i;

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

Цитата:
Сообщение от Dmitry_DM
А каким кодом правильнее всего считать I? Что бы уже точно правильно было. Может так:
Код:
s2:=i;
Считывать I уже не нужно. Нужно заменить в программе первый кусок кода который я привёл выше, на второй.
Ответить с цитированием
  #90  
Старый 16.08.2012, 11:13
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Считывать I уже не нужно. Нужно заменить в программе первый кусок кода который я привёл выше, на второй.
Это я понимаю, я про процедуру записи. Там стоит NumSamples:=1079; (просто так выбрал число). Что туда присваивать, что бы было так же как 1079, но уже само менялось, в зависимости от файла.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter