📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, DSNet, DSPack, DSUtil, DSCon, Options,
DirectShow9, MMSystem;
type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
FilterGraph: TFilterGraph;
VideoCapture: TFilter;
AudioCapture: TFilter;
VideoEncoder: TFilter;
AudioEncoder: TFilter;
DSNetSender1: TDSNetSender;
DSNetSender2: TDSNetSender;
DSUDPConnection1: TDSUDPConnection;
DSUDPConnection2: TDSUDPConnection;
SmartTee: TFilter;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
procedure StartFilterGraph;
procedure StopFilterGraph;
{ Public declarations }
end;
var
Form1: TForm1;
OptionForm: TOptionForm;
implementation
{$R *.dfm}
function GetFilterPin(Filter: IBaseFilter; PinDirection: TPinDirection; Index:
Integer = 1): IPin;
var
ppEnum: IEnumPins;
ppPins: IPin;
PinDirec: TPinDirection;
Count: Integer;
begin
if Filter <> nil then
begin
Count := 0;
Filter.EnumPins(ppEnum);
ppEnum.Next(1, ppPins, nil);
while ppPins <> nil do
begin
ppPins.QueryDirection(PinDirec);
if PinDirec = PinDirection then
begin
Inc(Count);
if Count >= Index then
begin
Break;
end;
end;
ppEnum.Next(1, ppPins, nil);
end;
end;
Result := ppPins;
end;
procedure TForm1.StartFilterGraph;
var
SysDev: TSysDevEnum;
ai, bi: Integer;
AMT: PAMMediaType;
AMStreamConfig: IAMStreamConfig;
AMAnalogVideoDecoder: IAMAnalogVideoDecoder;
VideoStandard: Integer;
ppPins1, ppPins2: IPin;
AMBN: IAMBufferNegotiation;
pprop: TAllocatorProperties;
AudioFormat: TWAVEFORMATEX;
VideoWindow: IVideoWindow;
begin
if not FilterGraph.Active then
begin
//Options Form
OptionForm := TOptionForm.Create(nil);
OptionForm.ShowModal;
OptionForm.GetInputIndex(ai, bi);
OptionForm.Free;
FilterGraph.Active := True;
//Get Video Capture
SysDev := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
VideoCapture.BaseFilter.Moniker := SysDev.GetMoniker(ai);
VideoCapture.FilterGraph := FilterGraph;
SysDev.Free;
//Video Capture Settings
VideoCapture.QueryInterface(IID_IAMAnalogVideoDecoder,
AMAnalogVideoDecoder);
if AMAnalogVideoDecoder <> nil then
begin
VideoStandard := AnalogVideo_PAL_B;
AMAnalogVideoDecoder.put_TVFormat(VideoStandard);
end;
ppPins1 := GetFilterPin((VideoCapture as IFilter).GetFilter,
PINDIR_OUTPUT);
ppPins1.QueryInterface(IAMStreamConfig, AMStreamConfig);
GetMem(AMT, SizeOf(TAMMediaType));
ZeroMemory(AMT, SizeOf(TAMMediaType));
AMStreamConfig.GetFormat(AMT);
AMT.majortype := MEDIATYPE_VIDEO;
AMT.subtype := MEDIASUBTYPE_RGB24;
PVideoInfoHeader(AMT.pbFormat).bmiHeader.biWidth := 320;
PVideoInfoHeader(AMT.pbFormat).bmiHeader.biHeight := 240;
PVideoInfoHeader(AMT.pbFormat).bmiHeader.biBitCount := 24;
AMStreamConfig.SetFormat(AMT^);
//Create Video FilterGraph
SmartTee.FilterGraph := FilterGraph;
ppPins1 := GetFilterPin((VideoCapture as IFilter).GetFilter,
PINDIR_OUTPUT);
ppPins2 := GetFilterPin((SmartTee as IFilter).GetFilter,
PINDIR_INPUT);
(FilterGraph as IFilterGraph2).Connect(ppPins1, ppPins2);
VideoEncoder.FilterGraph := FilterGraph;
VideoEncoder.FilterGraph := FilterGraph;
ppPins1 := GetFilterPin((SmartTee as IFilter).GetFilter,
PINDIR_OUTPUT);
ppPins2 := GetFilterPin((VideoEncoder as IFilter).GetFilter,
PINDIR_INPUT);
(FilterGraph as IFilterGraph2).Connect(ppPins1, ppPins2);
DSNetSender1.FilterGraph := FilterGraph;
ppPins1 := GetFilterPin((VideoEncoder as IFilter).GetFilter,
PINDIR_OUTPUT);
ppPins2 := GetFilterPin((DSNetSender1 as IFilter).GetFilter,
PINDIR_INPUT);
(FilterGraph as IFilterGraph2).Connect(ppPins1, ppPins2);
VideoEncoder.FilterGraph := FilterGraph;
ppPins1 := GetFilterPin((SmartTee as IFilter).GetFilter, PINDIR_OUTPUT, 2);
(FilterGraph as IFilterGraph2).Render(ppPins1);
//Get Audio Capture
SysDev := TSysDevEnum.Create(CLSID_AudioInputDeviceCategory);
AudioCapture.BaseFilter.Moniker := SysDev.GetMoniker(bi);
AudioCapture.FilterGraph := FilterGraph;
SysDev.Free;
//Audio Capture Settings
ppPins1 := GetFilterPin((AudioCapture as IFilter).GetFilter,
PINDIR_OUTPUT);
ppPins1.QueryInterface(IAMStreamConfig, AMStreamConfig);
AMStreamConfig.GetFormat(AMT);
AudioFormat := TWAVEFORMATEX(AMT.pbFormat^);
ppPins1.QueryInterface(IAMBufferNegotiation, AMBN);
pprop.cbBuffer := Round(AudioFormat.wBitsPerSample / 8 *
AudioFormat.nSamplesPerSec * 1 * 0.05);
pprop.cBuffers := 6;
pprop.cbAlign := Round(AudioFormat.wBitsPerSample / 8 * 1);
AMBN.SuggestAllocatorProperties(pprop);
//Create Audio FilterGraph
AudioEncoder.FilterGraph := FilterGraph;
ppPins1 := GetFilterPin((AudioCapture as IFilter).GetFilter,
PINDIR_OUTPUT);
ppPins2 := GetFilterPin((AudioEncoder as IFilter).GetFilter,
PINDIR_INPUT);
(FilterGraph as IFilterGraph2).Connect(ppPins1, ppPins2);
DSNetSender2.FilterGraph := FilterGraph;
ppPins1 := GetFilterPin((AudioEncoder as IFilter).GetFilter,
PINDIR_OUTPUT);
ppPins2 := GetFilterPin((DSNetSender2 as IFilter).GetFilter,
PINDIR_INPUT);
(FilterGraph as IFilterGraph2).Connect(ppPins1, ppPins2);
//Set Video Window
FilterGraph.QueryInterface(IVideoWindow, VideoWindow);
VideoWindow.put_Owner(Panel1.Handle);
VideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
VideoWindow.put_WindowStyleEx(GetWindowLong(Handle, GWL_EXSTYLE));
VideoWindow.SetWindowPosition(0, 0, 320, 240);
VideoWindow.put_Visible(True);
end;
//Save MediaType
DSNetSender1.MediaType.SaveToFile('Data/VideoFormat.dat');
DSNetSender2.MediaType.SaveToFile('Data/AudioFormat.dat');
DSUDPConnection1.Active := True;
DSUDPConnection2.Active := True;
FilterGraph.Play;
end;
procedure TForm1.StopFilterGraph;
begin
FilterGraph.Stop;
FilterGraph.Active := False;
FilterGraph.ClearGraph;
DSUDPConnection1.Active := False;
DSUDPConnection2.Active := False;
VideoCapture.FilterGraph := nil;
VideoEncoder.FilterGraph := nil;
SmartTee.FilterGraph := nil;
DSNetSender1.FilterGraph := nil;
AudioCapture.FilterGraph := nil;
AudioEncoder.FilterGraph := nil;
DSNetSender2.FilterGraph := nil;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
StartFilterGraph;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
StopFilterGraph;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
StopFilterGraph;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -