Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2010, 21:53   #1
Jacobson
Пользователь
 
Аватар для Jacobson
 
Регистрация: 26.01.2010
Сообщений: 47
Сообщение Работа с аудио в DSPack

Здравствуйте! Судя по названию темы вы понимаете что меня интересует возможности библиотеки, "DSPack" по работе с аудио данными. Я уже задавал несколько вопросов по этой теме на данном форуме но не кто не откликнулся на не на один из них! Я уже стал думать что действительно данная библиотека не может работать с аудио данными... Но если покапать в прилагаемых примерах и поискать разную документацию, то можно понять что это не так! Вообще в библиотек, "DSPack" есть возможность работы с аудио данными!!! Но мне до сих пор остаётся не понятным каким образом можно получать звук с устройства и записывать его в буфер? Копался в "DirectShow" но совсем загнал себя в тупик! Уже не знаю что и делать... Думаю перейти на использование другой библиотеки... Но мне как то "DSPack" более по нраву но вот только запутано и многое не ясно... Может быть кто-то, что-то хотя бы посоветует???
Работа с аудио данными, звуком вообще очень сложная и гиблая тема! Что я на собственной шкуре понял! Вообще изучаю возможности, "DirectShow" с помощью, "DSPack" и т.д. Пишу пробные, программные коды но не чего путного не получается... Всё хочу сделать возможным получение звука с аудио устройства, записи его в буфер и передачу аудио данных из буфера по сети используя, "UDP Socket". Ну а на другом конце разумеется получение и воспроизведение отправленного/полученного звука. В общем я прошу совета, помощи!
P.S.: Был на форумах, "forum.wonderu.com" и "forum.vingrad.ru" тоже не чего не нашёл... Если есть что сказать, предложить? Пишите я отвечу на все сообщения!!!
Всё не то чем кажется...
Jacobson вне форума Ответить с цитированием
Старый 02.08.2010, 09:31   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
получение звука с аудио устройства, записи его в буфер и передачу аудио данных из буфера по сети используя, "UDP Socket"
1- журнал Клуба ПРОграммистов №3, 2010, с.33 (исходники включены)
2- статья VoIP шлюз

p.s.: считаю избыточным использование directshow для этих целей, ибо достаточно api
p.s.: что касается прошлых ваших тем по samplegrabber для аудио, то в примере построения графа достаточно указать вместо MEDIATYPE_Video тип данных MEDIATYPE_Audio и сабтип wav-pcm или mpeg1audio, ну и есстественно - при грабе выгребать из памяти не картинку, а аудиоданные в выбранном формате ...НО как уже сказал, имхо api
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 06.08.2010, 03:58   #3
Jacobson
Пользователь
 
Аватар для Jacobson
 
Регистрация: 26.01.2010
Сообщений: 47
По умолчанию

Ухты! Я уже и не думал что кто-тот ответит... Спасибо за ответ и предложенные советы! Предложанный вами материал я обязательно посмотрю! А можно вопрос, почему вы считаете что использование, "DirectShow" избыточно для этой цели?
Сказать по правде у меня пока нет должного опыта работы с аудио в "Delphi"... Но мне удалось набросать небольшой пример работы с звуковым устройством, использовал для этой цели я набор компонентов, "DSPack"! В данном примере я и хотел попробовать реализовать данный метод. Но если вы посмотрите сам проект то поймёте что у меня не чего не получилось... Пример я прикрепил ниже, пожалуйста посмотрите и скажите что вы думаете. В частности было бы интересно узнать почему код не работает и т.д.
P.S.: Очень буду ждать вашего ответа!
Вложения
Тип файла: zip Project1.zip (3.7 Кб, 61 просмотров)
Всё не то чем кажется...
Jacobson вне форума Ответить с цитированием
Старый 16.08.2010, 21:23   #4
Jacobson
Пользователь
 
Аватар для Jacobson
 
Регистрация: 26.01.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
что касается прошлых ваших тем по samplegrabber для аудио, то в примере построения графа достаточно указать вместо MEDIATYPE_Video тип данных MEDIATYPE_Audio и сабтип wav-pcm или mpeg1audio, ну и есстественно - при грабе выгребать из памяти не картинку, а аудиоданные в выбранном формате ...
А как это сделать, если не секрет? Я всё же не так хорошо разбираюсь в технологии, "DirectShow". Да и с звуком практически вообще не когда не работал... Но очень хочу научиться! Может быть, пожалуй вы и правы что использование, "DirectShow" для этой цели весьма избыточно... Но если честно мне всё же это очень интересно! Помогите разобраться?
P.S.: Забавно до ужаса! Все знают как работать с изображением но не кто не чего не может сказать по поводу звука...
Всё не то чем кажется...

Последний раз редактировалось Jacobson; 16.08.2010 в 21:31.
Jacobson вне форума Ответить с цитированием
Старый 28.09.2010, 01:32   #5
Jacobson
Пользователь
 
Аватар для Jacobson
 
Регистрация: 26.01.2010
Сообщений: 47
По умолчанию

Я бы хотел ещё раз вернуться к этой теме! В предыдущий раз я выкладывал небольшой пример программы в месте с её исходным кодом. Программа являлась примером нахождения и запуска аудио устройства с заданными параметрами. Ниже я приведу отрывок из моей программы:
Код:
var
  SystemDeviceAudio: TSysDevEnum;
  AudioMediaTypes: TEnumMediaType;

//Код который выполняет поиск аудио устройств:
var
  Integral: Integer;
begin
  SystemDeviceAudio := TSysDevEnum.Create(CLSID_AudioInputDeviceCategory);
  if SystemDeviceAudio.CountFilters > 0 then
  begin
    //Если имеется хотя бы одно устройство добавляем его в список
    for Integral := 0 to SystemDeviceAudio.CountFilters - 1 do
    begin
      ListAudioDevices.Items.Append(SystemDeviceAudio.Filters[Integral].FriendlyName);
    end;
    //Ну и создаем для него, MediaType
    AudioMediaTypes := TEnumMediaType.Create;
  end;
end;
//Код обработки аудио устройства
var
  ABool: LongBool;
  Integral, LineIndex: Integer;
  AudioPinList: TPinList;
begin
  //Устанавливаем категорию и захват с устройства
  SystemDeviceAudio.SelectGUIDCategory(CLSID_AudioInputDeviceCategory);
  if ListAudioDevices.ItemIndex <> - 1 then
  begin
    FilterGraph.Stop;
    FilterGraph.ClearGraph;
    FilterGraph.Active := False;
    AudioFilter.BaseFilter.Moniker := SystemDeviceAudio.GetMoniker(ListAudioDevices.ItemIndex);
    FilterGraph.Active := True;
    AudioPinList := TPinList.Create(AudioFilter as IBaseFilter);
    try
      //Тут начинается заполнение списка форматом
      ListAudioFormats.Clear;
      Integral := 0;
      while Integral < AudioPinList.Count do
      begin
        if AudioPinList.PinInfo[Integral].Dir = PINDIR_OUTPUT then
        begin
          AudioMediaTypes.Assign(AudioPinList.Items[Integral]);
          AudioPinList.Delete(Integral);
        end
        else
        begin
          Inc(Integral);
        end;
      end;
      //Если такие существуют вносим их в список
      for Integral := 0 to AudioMediaTypes.Count - 1 do
      begin
        ListAudioFormats.Items.Append(AudioMediaTypes.MediaDescription[Integral]);
      end;
      FilterGraph.Active := False;
      //А этот код отвечает за источник с которого будем брать сигнал и т.д.
      ComboAudioLines.Clear;
      LineIndex := - 1;
      //Загружаем всё что помет считывать сигнал
      for Integral := 0 to AudioPinList.Count - 1 do
      begin
        ComboAudioLines.Items.Append(AudioPinList.PinInfo[Integral].achName);
        with (AudioPinList.Items[Integral] as IAMAudioInputMixer) do
        begin
          Get_Enable(ABool);
          if ABool then
          begin
            LineIndex := Integral;
          end;
        end;
      end;
      ComboAudioLines.ItemIndex := LineIndex;
    finally
      AudioPinList.Free;
    end;
  end;
end;
//Следующий код выполняет подготовку к запуску устройства с заданными для него параметрами и т.д.
var
  Integral: Integer;
  AudioPinList: TPinList;
begin
  FilterGraph.Active := True;
  if AudioFilter.FilterGraph <> nil then
  begin
    AudioPinList := TPinList.Create(AudioFilter as IBaseFilter);
    try
      Integral := 0;
      while Integral < AudioPinList.Count do
      begin
        if AudioPinList.PinInfo[Integral].Dir = PINDIR_OUTPUT then
        begin
          if ListAudioFormats.ItemIndex <> - 1 then
          begin
            //Проверяем ещё раз есть ли какие либо параметры и т.д.
            if AudioMediaTypes.Count > 1 then
            begin
              with (AudioPinList.Items[Integral] as IAMStreamConfig) do
              begin
                //Если ответ положительный, то присваеваем тот или иной формат
                SetFormat(AudioMediaTypes.Items[ListAudioFormats.ItemIndex].AMMediaType^);
              end;
            end
            else
            begin
              //А если отрицательный, то просто запускаем устройтво с стандартными параметрами
              AudioFilter.BaseFilter.Moniker := SystemDeviceAudio.GetMoniker(ListAudioDevices.ItemIndex);
            end;
          end;
          AudioPinList.Delete(Integral);
        end
        else
        begin
          Inc(Integral);
        end;
      end;
      //Это уже ясно
      if ComboAudioLines.ItemIndex <> - 1 then
      begin
        with (AudioPinList.Items[ComboAudioLines.ItemIndex] as IAMAudioInputMixer) do
        begin
          Put_Enable(True);
        end;
      end;
    finally
      AudioPinList.Free;
    end;
  end;
end;
//Это код запуска устройства
begin
  with FilterGraph as ICaptureGraphBuilder2 do
  begin
    if AudioFilter.BaseFilter <> nil then
    begin
      RenderStream(nil, nil, AudioFilter as IBaseFilter, nil, SampleGrabber as IBaseFilter);
    end;
  end;
  FilterGraph.Play;
end;

{
  А вот что делать дальше? Вернее как записать данные в буффер или поток для отправки и получения я пока не знаю...
}
Всё не то чем кажется...
Jacobson вне форума Ответить с цитированием
Старый 10.01.2012, 17:30   #6
3asys
Новичок
Джуниор
 
Регистрация: 16.10.2011
Сообщений: 1
По умолчанию Воспроизведение звука из буфера через DSPack

Уважаемый Jacobson,
если Вам удалось решить проблему с получение звука с SampleCrabber-а из DSPack, то не могли бЫ Вы привести здесь пример, того, как ПОЛУЧИТЬ звук с SampleGraber-а и ВОСПРОИЗВЕСТИ его (например, в колонках)?
Стоит такая - же проблема и не удается найти решения.
Буду очень признателен за пример кода, заранее благодарен.
3asys вне форума Ответить с цитированием
Старый 18.05.2012, 21:03   #7
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

в демке с компонентом есть пример записи видео и звука
casio23 вне форума Ответить с цитированием
Старый 19.05.2012, 07:27   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
ПОЛУЧИТЬ звук с SampleGraber-а и ВОСПРОИЗВЕСТИ его (например, в колонках)?
а зачем вам его грабить, что мешает сразу воспроизвести?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 19.05.2012, 08:58   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Jacobson Посмотреть сообщение
Я уже стал думать что действительно данная библиотека не может работать с аудио данными...
Мне кажется, вывод явно нелогичный.
Из того, что лично Вы не умеете работать с библиотекой, отнюдь не следует, что библиотека чего-то не может.
Хотя, всякое бывает.
Цитата:
Но мне до сих пор остаётся не понятным каким образом можно получать звук с устройства и записывать его в буфер?
Указанной Вами библиотеки я в глаза не видел, но из общих соображений могу сказать, что библиотека работы со звуком может как включать, так и не включать взаиможействие сл звуковыми устройствами.
Кстати, только во втором случае она может быть платформонезависимой.
Опять же, обработка звука - задача несоизмеримо более сложная, чем ввод/вывод (звука).
Со своей стороны могу порекомендовать получать звук посредством WinAPI, конкретно модуль MMSystem.
Цитата:
Работа с аудио данными, звуком вообще очень сложная и гиблая тема!
Ну, гиблая - это вряд ли, а вот сложная - да.
Некоторые программисты почему-то думают, что умения программировать достаточно для того, чтобы написать программу обработки звука.
Это не так. Нужно хорошо знать математику и разбираться в акустике.
Так что если подобных знаний у Вас нет, то дело, действительно, гиблое.
Не следует надеяться, что библиотека все сделает за Вас. Вы сами должны понимать, что такое звук, и как и зачем его обрабатывать.

Да, в течение последних двух недель в этом разделе пробегала ссылка на подходящую литературу. Называется примерно "Программирование звука в Windows", год издания где-то в районе 2000 - поищите.

Последний раз редактировалось s-andriano; 19.05.2012 в 09:01.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с видео и аудио устройствами в Турбо Паскале Morphling Фриланс 8 04.11.2009 14:43
DSPack - установка Krechet Мультимедиа в Delphi 2 09.07.2009 10:23
проблема с DSPack XATAB Мультимедиа в Delphi 0 26.06.2009 20:15
Работа с аудио (потоками) JamS007 Общие вопросы C/C++ 2 14.02.2009 22:14