⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 适用于网络监控,视频聊天,网络VOD等多媒体数据流的网络传输与回放.控件包目前包括三个控件
💻 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 + -