📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, DSCon, DSPack, DSNet, DirectShow9;
type
TForm1 = class(TForm)
Button2: TButton;
Button1: TButton;
DSNetReceiver1: TDSNetReceiver;
DSNetReceiver2: TDSNetReceiver;
FilterGraph: TFilterGraph;
DSUDPConnection1: TDSUDPConnection;
DSUDPConnection2: TDSUDPConnection;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure StartFilterGraph;
procedure StopFilterGraph;
public
{ Public declarations }
end;
var
Form1: TForm1;
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
Pin: IPin;
VideoWindow: IVideoWindow;
begin
if not FilterGraph.Active then
begin
FilterGraph.Active := True;
DSNetReceiver1.FilterGraph := FilterGraph;
DSNetReceiver1.MediaType.LoadFromFile('Data/VideoFormat.dat');
DSNetReceiver1.MaxBufferSize := 921648;
Pin := GetFilterPin((DSNetReceiver1 as IFilter).GetFilter, PINDIR_OUTPUT);
(FilterGraph as IFilterGraph2).Render(Pin);
DSNetReceiver2.FilterGraph := FilterGraph;
DSNetReceiver2.MediaType.LoadFromFile('Data/AudioFormat.dat');
DSNetReceiver2.MaxBufferSize := 3231;
Pin := GetFilterPin((DSNetReceiver2 as IFilter).GetFilter, PINDIR_OUTPUT);
(FilterGraph as IFilterGraph2).Render(Pin);
//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);
(FilterGraph as IFilterGraph2).SetDefaultSyncSource;
end;
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;
DSNetReceiver1.FilterGraph := nil;
DSNetReceiver2.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 + -