织梦CMS - 轻松建站从此开始!

罗索

DirectShow使用点滴

jackyhwei 发布于 2011-06-21 14:01 点击:次 
在dshow中可调用pBuilder->connect(pout,pin),连接两个filter,如果这两个pin之间不能直接连接,dshow会自动插入必要的filter。但是智能连接不能在同一个输出pin上连接两次,如一个文件同时含有音视频,此时通过splitter filter需要连接两个filter分别处理音视频
TAG:

1,时间戳

  1. // Set the graph clock. 
  2. IMediaFilter *pMediaFilter = 0; 
  3. hr=m_pBuilder->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter); 
  4. pMediaFilter->SetSyncSource(NULL); 

通过如上设置,可以使文件尽快解码完成。

  1. IMediaSample * pSample; 
  2. REFERENCE_TIME startTime,stopTime; 
  3. hr=pSample->GetTime(&startTime,&stopTime); 

获取该帧数据的相对时间戳,以100ns为单位。即使文件不以实际速度播放,获取的时间戳也是按实际帧率递增的。

2,在dshowutil.cpp中提供了一些常用的函数,如GetOutPin,GetInPin,FindAudioRenderer,FindVideoRenderer等。

在dshow中可调用pBuilder->connect(pout,pin),连接两个filter,如果这两个pin之间不能直接连接,dshow会自动插入必要的filter。但是智能连接不能在同一个输出pin上连接两次,如一个文件同时含有音视频,此时通过splitter filter需要连接两个filter分别处理音视频,智能连接不能对source filter的同一个输出pin调用两次connect。

在dshow中通过pBuilder->AddFilter(…),加入filter。在调用renderfile智能连接时,会对加入的filter优先连接。另外在enumfilter进行枚举时,只要加入进来的filter都能找到,不必一定要进行connect。

3,获取音视频的基本信息,如宽度、高度,音频采样率、通道等信息。

通过IMediaSample.GetMediaType或者IPin. ConnectionMediaType得到一个AM_MEDIA_TYPE结构体。从该结构体中元素pbFormat可以得到VIDEOINFOHEADER或者WAVEFORMATEX信息。从中可以访问音视频的一些基本信息。

4,可以通过m_pSeeking->SetPositions设置文件播放的开始时间和结束时间,如果结束时间大于文件长度,播放到文件尾结束。如果开始时间大于文件长度,播放不会进行。调用上述函数后,从media sample中获取到的时间(hr=pSample->GetTime(&startTime,&stopTime);) 是相对于文件开始播放位置的,而不是文件头。 

5,自定义guid用下面的方式

DEFINE_GUID(MEDIATYPE_HikVideo,0x0d117d31, 0xef56, 0x4fbe, 0x89, 0x10, 0x28, 0x53, 0x81, 0x60, 0xe0, 0x4e);

另外需要在之前包含#include "initguid.h"。该头文件不能在多个文件中包含。

6,尽量用CComPtr<IPin> 这种方式代替IPin* ,可以减少内存泄露,不需要应用程序调用release释放内存。

(lipku)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201106/14592.html]
本文出处:CSDN博客 作者:lipku
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容