DirectShow使用点滴

1,时间戳

// Set the graph clock.

    IMediaFilter *pMediaFilter = 0;

    hr=m_pBuilder->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);

pMediaFilter->SetSyncSource(NULL);

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

 

IMediaSample * pSample;

REFERENCE_TIME startTime,stopTime;

hr=pSample->GetTime(&startTime,&stopTime);

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

 

 

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

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释放内存。

发布了32 篇原创文章 · 获赞 8 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/lipku/article/details/4990202