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

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

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

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

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

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

Здравствуйте! Прошу совета или правильнее наверное будет сказать помощи... В общем я решил переформулировать свой вопрос. Используя, "DSPack" я составил программный код который ищет аудио устройства, определяет форматы поддерживаемые тем или иным устройством для работы с ним. Исходный код этого можно будет посмотреть ниже. Но меня интересует вот что как бы мне используя мой программный код при запуске аудио устройства с заданными параметрами передавать аудио поток через, "UDPSocket" из библиотеки, "Indy"? Думаю надо записывать аудио данные в "SampleGrabber" а далее используя некий программный код "SampleGrabber" который будет записывать аудио данные подобно как он это делает с изображением. Хм... Вроде бы "SampleGrabber" может работать с аудио...

Код:
var
  Integral: Integer;
begin
  SystemDeviceAudio := TSysDevEnum.Create(CLSID_AudioInputDeviceCategory);
  if SystemDeviceAudio.CountFilters > 0 then
  begin
    SystemDeviceAudio.SelectGUIDCategory(CLSID_AudioInputDeviceCategory);
    for Integral := 0 to SystemDeviceAudio.CountFilters - 1 do
    begin
      ListAudioDevices.Items.Append(SystemDeviceAudio.Filters[Integral].FriendlyName);
    end;
    AudioMediaTypes := TEnumMediaType.Create;
  end;
end;
Код:
var
  AudioPinList: TPinList;
  Integral, LineIndex: Integer;
  Boolean: LongBool;
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;
      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(Boolean);
        end;
        if Boolean then
        begin
          LineIndex := Integral;
        end;
      end;
      ComboAudioLines.ItemIndex := LineIndex;
    finally
      FilterGraph.Stop;
      FilterGraph.ClearGraph;
      FilterGraph.Active := False;
      AudioPinList.Free;
    end;
  end;
end;
Код:
var
  Integral: Integer;
  AudioPinList: TPinList;
begin
  SystemDeviceAudio.SelectGUIDCategory(CLSID_AudioInputDeviceCategory);
  if ListAudioFormats.ItemIndex <> - 1 then
  begin
    FilterGraph.Stop;
    FilterGraph.ClearGraph;
    FilterGraph.Active := False;
    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
              with (AudioPinList.Items[Integral] as IAMStreamConfig) do
              begin
                SetFormat(AudioMediaTypes.Items[ListAudioFormats.ItemIndex].AMMediaType^);
              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;
        with FilterGraph as ICaptureGraphBuilder2 do
        begin
          if AudioFilter.FilterGraph <> nil then
          begin
            CheckDSError(RenderStream(nil, nil, AudioFilter as IBaseFilter, nil, AudioGrabber as IBaseFilter));
          end;
        end;
      finally
        AudioPinList.Free;
        FilterGraph.Play;
      end;
    end;
  end;
end;
Знаю программный код весьма громоздкий! Но на нём в целом строится вся экспериментальная программа. Очень хочу реализовать данный метод передачи используя выше указанный программный код. Но если что-то сделано не правильно или "SampleGrabber" всё же не может работать со звуком? То... Отпишитесь!
Всё не то чем кажется...

Последний раз редактировалось Jacobson; 22.07.2010 в 17:50.
Jacobson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аудио конвертер Tirendus Софт 13 19.05.2012 19:11
C++ 2008 аудио ? denes Общие вопросы C/C++ 0 09.06.2010 21:45
запись из потока в массив Владимир1988 Помощь студентам 2 06.02.2010 03:08
Аудио наркотики VintProg Свободное общение 39 08.08.2009 19:27
Запись аудио, видео информации на CD, DVD Virtson Общие вопросы Delphi 2 11.01.2007 19:50