DirectShow使用点滴

本文介绍了DirectShow中时间戳的设置与获取方法,包括文件解码优化、智能连接限制、音视频基本信息获取、播放时间控制及自定义GUID的实现。此外还涉及了内存管理技巧。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值