Здравствуйте! Прошу совета или правильнее наверное будет сказать помощи... В общем я решил переформулировать свой вопрос. Используя, "
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" всё же не может работать со звуком? То... Отпишитесь!