读书人

DS捕捉摄像头视频,该怎么解决

发布时间: 2012-03-24 14:00:46 作者: rapoo

DS捕捉摄像头视频
DS捕捉摄像头视频
怎么把音频文件附加到视频里?
RenderStream 可以附加话筒音频到视频 里
我现在想做的是把硬盘里的音频 文件附加到视频里.

[解决办法]

RenderStream不是也要制定Source的输出pin么?
加入一个source加载你这个音频文件然后RenderStream从这个source的输出pin开始,截止端不变
[解决办法]
用这个SDK包好了:http://www.anychat.cn
[解决办法]

Delphi(Pascal) code
uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ComCtrls, ExtCtrls, Menus, ImgList, DSPack, DSUtil, DirectShow9, ToolWin, ActnList,  jpeg;procedure Tfrm_Main.VMRTextOut(AText: string);var  VMRBitmap: TVMRBitmap;begin  if AText = '' then exit;  VMRBitmap := TVMRBitmap.Create(VideoWindow1);  with VMRBitmap, Canvas do  begin    LoadEmptyBitmap(VideoWindow1.Width, VideoWindow1.Height, pf24bit, clSilver);    Source := VMRBitmap.Canvas.ClipRect;    Options := VMRBitmap.Options + [vmrbSrcColorKey];    ColorKey := clSilver;    Brush.Color := clSilver;    Font := frm_Option.AFont;    TextOut(0, 0, AText);    DrawTo(0, 0, 1, 1, 0.5);  end;  VMRBitmap.Free;end;procedure Tfrm_Main.A_PlayExecute(Sender: TObject);var  Multiplexer: IBaseFilter;  Writer: IFileSinkFilter;  PinList: TPinList;  i: integer;  FSize: TPoint;begin  with frm_Option do  begin    if CB_VideoFormats.ItemIndex <> -1 then    begin      FSize := GetMediaTypeOfSize(VideoMediaTypes.Items[CB_VideoFormats.ItemIndex].AMMediaType^);      if FSize.X <> 0 then        frm_Main.Width := FSize.X + 8;      if FSize.Y <> 0 then        frm_Main.Height := FSize.Y + 94;    end;    FilterGraph.Mode := gmCapture;    FilterGraph.Active := true;    if AudioSourceFilter.FilterGraph <> nil then    begin      PinList := TPinList.Create(AudioSourceFilter as IBaseFilter);      i := 0;      while i < PinList.Count do        if PinList.PinInfo[i].dir = PINDIR_OUTPUT then        begin          if CB_AudioFormats.ItemIndex <> -1 then            with (PinList.Items[i] as IAMStreamConfig) do              SetFormat(AudioMediaTypes.Items[CB_AudioFormats.ItemIndex].AMMediaType^);          PinList.Delete(i);        end else inc(i);      if CB_InputLines.ItemIndex <> -1 then        with (PinList.Items[CB_InputLines.ItemIndex] as IAMAudioInputMixer) do          put_Enable(true);      PinList.Free;    end;    if VideoSourceFilter.FilterGraph <> nil then    begin      PinList := TPinList.Create(VideoSourceFilter as IBaseFilter);      if CB_VideoFormats.ItemIndex <> -1 then        with (PinList.First as IAMStreamConfig) do          SetFormat(VideoMediaTypes.Items[CB_VideoFormats.ItemIndex].AMMediaType^);      PinList.Free;    end;    with FilterGraph as IcaptureGraphBuilder2 do    begin      if VideoSourceFilter.BaseFilter.DataLength > 0 then        RenderStream(@PIN_CATEGORY_PREVIEW, nil, VideoSourceFilter as IBaseFilter,          nil, VideoWindow1 as IBaseFilter);      if A_Capture.Checked then      begin        SetOutputFileName(MEDIASUBTYPE_Avi, PWideChar(CapFName), Multiplexer, Writer);        if VideoSourceFilter.FilterGraph <> nil then          RenderStream(@PIN_CATEGORY_CAPTURE, nil, VideoSourceFilter as IBaseFilter,            nil, Multiplexer as IBaseFilter);        if AudioSourceFilter.FilterGraph <> nil then        begin          RenderStream(nil, nil, AudioSourceFilter as IBaseFilter,            nil, Multiplexer as IBaseFilter);        end;      end;    end;    FilterGraph.Play;    VMRTextOut(frm_Option.E_Text.Text); //字幕    Timer1.Enabled := true;  end;  A_Play.Checked := True;  A_Capture.Enabled := True;end;procedure Tfrm_Main.A_StopExecute(Sender: TObject);begin  Timer1.Enabled := False;  A_Play.Checked := False;  frm_Option.FilterGraph.Stop;  frm_Option.FilterGraph.Active := False;    VideoWindow1.Canvas.Lock;  try    VideoWindow1.Canvas.StretchDraw(VideoWindow1.Canvas.ClipRect, Image1.Picture.Graphic);  finally    VideoWindow1.Canvas.Unlock;  end;end; 


[解决办法]
用ASFWriter可以不

读书人网 >.NET

热点推荐