delphi 视频录制问题

liqiao_2010 2013-11-06 03:29:35
查了下资料,说directshow比vfw兼容性更好,于是找到了dspack控件,但录制视频时出现视频与音频不同步的情况,即录完后,声音有10分钟,视频才4分钟。用了2.3.4 for xe4和2.3.1 for d7,都是一样的情况,接着尝试用vfw,发现在我xp的机器上不显示视频,但可以录制。求高手指点。 或者推荐另外的技术方向也行。
...全文
362 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
guanlianan 2014-03-15
  • 打赏
  • 举报
回复
这里有DSPACK FOR XE3 ,刚刚我在电脑上也装了,运行DEMO的录像功能,视频和音频一切正常…… 唯一不正常的是——录制的AVI实在太大了 http://download.csdn.net/detail/guanlianan/7043121
guanlianan 2014-03-15
  • 打赏
  • 举报
回复
这里有 http://download.csdn.net/detail/guanlianan/7043121
liqiao_2010 2013-11-13
  • 打赏
  • 举报
回复
谢谢,收到你的demo了,在我机器上还是不同步的。你是用的dspack哪个版本。先把分给你,
liqiao_2010 2013-11-12
  • 打赏
  • 举报
回复
能把你demo发给我一下吗,我qq 120911940
mdejtod 2013-11-12
  • 打赏
  • 举报
回复
跟摄像头硬件和音频录入设备都有关系
mdejtod 2013-11-12
  • 打赏
  • 举报
回复
我就是用上面那种方法录制的,基本上都可以同步
liqiao_2010 2013-11-11
  • 打赏
  • 举报
回复
引用 5 楼 mdejtod 的回复:
音频和视频压缩filter
兄弟,我试了一下,还是不行,不知道怎么设置的,能加一下我QQ吗?我发源码给你。120911940
mdejtod 2013-11-11
  • 打赏
  • 举报
回复
音频和视频压缩filter
liqiao_2010 2013-11-11
  • 打赏
  • 举报
回复
改了也是问题依旧,视频快于音频,我把代码贴一下。兄弟,能加一下Q最好了。
procedure TMainForm.StartButtonClick(Sender: TObject);
var
  multiplexer: IBaseFilter;
  Writer: IFileSinkFilter;
  PinList: TPinList;
  i: integer;
  pGS: IAMGraphStreams;
  pConfigMux: IConfigAviMux;
begin

  // Activate the filter graph, at this stage the source filters are added to the graph
  CaptureGraph.Active := true;

  // configure output Audio media type + source
  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 AudioFormats.ItemIndex <> -1 then
          with (PinList.Items[i] as IAMStreamConfig) do
            SetFormat(AudioMediaTypes.Items[AudioFormats.ItemIndex]
              .AMMediaType^);
        PinList.Delete(i);
      end
      else
        inc(i);
    if InputLines.ItemIndex <> -1 then
      with (PinList.Items[InputLines.ItemIndex] as IAMAudioInputMixer) do
        put_Enable(true);
    PinList.Free;
  end;

  // configure output Video media type
  if VideoSourceFilter.FilterGraph <> nil then
  begin
    PinList := TPinList.Create(VideoSourceFilter as IBaseFilter);
    if VideoFormats.ItemIndex <> -1 then
      with (PinList.First as IAMStreamConfig) do
        SetFormat(VideoMediaTypes.Items[VideoFormats.ItemIndex].AMMediaType^);
    PinList.Free;
  end;

  // 音频视频同步
  if CaptureGraph.QueryInterface(IID_IAMGraphStreams, pGS) = 0 then
  begin
    pGS.SyncUsingStreamOffset(true);
    pGS := nil;
  end;
  IF CaptureGraph.QueryInterface(IID_IConfigAviMux, pConfigMux) = 0 then
  begin
    pConfigMux.SetMasterStream(1);
    pConfigMux := nil;
  end;

  // now render streams
  with CaptureGraph as IcaptureGraphBuilder2 do
  begin
    // set the output filename
    SetOutputFileName(MEDIASUBTYPE_Avi, PWideChar(CapFile),
      multiplexer, Writer);

    // Connect Video preview (VideoWindow)
    if VideoSourceFilter.BaseFilter.DataLength > 0 then
      RenderStream(@PIN_CATEGORY_PREVIEW, nil, VideoSourceFilter as IBaseFilter,
        nil, VideoWindow as IBaseFilter);

    // Connect Video capture streams
    if VideoSourceFilter.FilterGraph <> nil then
      RenderStream(@PIN_CATEGORY_CAPTURE, nil, VideoSourceFilter as IBaseFilter,
        nil, multiplexer as IBaseFilter);

    // Connect Audio capture streams
    if AudioSourceFilter.FilterGraph <> nil then
    begin

      RenderStream(nil, nil, AudioSourceFilter as IBaseFilter, nil,
        multiplexer as IBaseFilter);
    end;
  end;
  CaptureGraph.Play;
  StopButton.Enabled := true;
  StartButton.Enabled := false;
  AudioFormats.Enabled := false;
  AudioCapFilters.Enabled := false;
  VideoFormats.Enabled := false;
  VideoCapFilters.Enabled := false;
  Timer.Enabled := true;
end;
mdejtod 2013-11-11
  • 打赏
  • 举报
回复
不用压缩,改为NIL RenderStream(@PIN_CATEGORY_CAPTURE, nil, VideoSourceFilter as IBaseFilter, nil, multiplexer as IBaseFilter); RenderStream(nil, nil, AudioSourceFilter as IBaseFilter, nil, multiplexer as IBaseFilter);
liqiao_2010 2013-11-08
  • 打赏
  • 举报
回复
兄弟,先谢谢你,请问VideoCompress和AudioCompress是什么控件?
mdejtod 2013-11-08
  • 打赏
  • 举报
回复

procedure Tfrmmain.StartRecord;
  var multiplexer: IBaseFilter;
      Writer: IFileSinkFilter;
      pGS : IAMGraphStreams;
      pConfigMux : IConfigAviMux;
begin
  FRecordTime := 0;
  FRecordFile := FSaveFolder + FCombineFile;
  CaptureGraph.Stop;
  VideoCompress.FilterGraph := CaptureGraph;
  AudioCompress.FilterGraph := CaptureGraph;
  CaptureGraph.Active := true;

  //音频视频同步
  if CaptureGraph.QueryInterface(IID_IAMGraphStreams, pGS) = 0 then
  begin
    pGS.SyncUsingStreamOffset(TRUE);
    pGS := nil;
  end;
  IF CaptureGraph.QueryInterface(IID_IConfigAviMux,pConfigMux) = 0 then
  begin
    pConfigMux.SetMasterStream(1);
    pConfigMux := nil;
  end;
  with CaptureGraph as IcaptureGraphBuilder2 do
  begin 
    SetOutputFileName(MEDIASUBTYPE_Avi, PWideChar(FRecordFile), multiplexer, Writer);
    if VideoSourceFilter.BaseFilter.DataLength > 0 then
      RenderStream(@PIN_CATEGORY_PREVIEW, @MEDIATYPE_Video, VideoSourceFilter as IBaseFilter, nil , RecordWindow as IBaseFilter);
    RenderStream(@PIN_CATEGORY_CAPTURE, nil, VideoSourceFilter as IBaseFilter,  VideoCompress as IBaseFilter, multiplexer as IBaseFilter);
    RenderStream(nil, nil, AudioSourceFilter as IBaseFilter,  AudioCompress as IBaseFilter, multiplexer as IBaseFilter);
  end;
  CaptureGraph.Play;
  GBeginRecord := True;
  tmrcount.Enabled := True;
end;
liqiao_2010 2013-11-08
  • 打赏
  • 举报
回复
自己再顶一下,没人吗?
liqiao_2010 2013-11-07
  • 打赏
  • 举报
回复
没人嘛,自己顶一下。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧