Created
July 12, 2014 16:26
-
-
Save chenzx/b50b408449a5a68bc78a to your computer and use it in GitHub Desktop.
Visual C++音频视频技术开发与实践 笔记
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Visual C++音频视频技术开发与实践 | |
跳转至: 导航、 搜索 | |
目录 | |
1 DirectShow来了 | |
1.1 DirectShow基础 | |
2 DirectShow核心技术分析 | |
2.1 Filter Graph及其组成 | |
2.2 构建Filter Graph | |
2.3 数据流在Filter Graph中的流动 | |
2.4 事件通知机制(Filter通知Graph Manager) | |
2.5 时间的意义 | |
2.6 动态重建可靠吗 | |
2.7 剖析SDK基类源码 | |
2.8 开发一个视频播放器 | |
2.9 DirectShow基本应用 | |
2.10 编写自己的Filter | |
3 VFW实现视频处理 | |
DirectShow来了 | |
DirectShow基础 | |
IPin | |
完整的媒体类型连接 | |
枚举: | |
优先满足输入引脚,然后是输入引脚 | |
AM_MEDIA_TYPE:Major + Sub + Format | |
GUID_NULL | |
Pin之间的数据流动: | |
推模式:IMemInputPin | |
拉模式:IAsyncReader | |
IMediaEvent::WaitForCompletion(INFINITE, &evCode); | |
DirectShow核心技术分析 | |
Filter Graph及其组成 | |
当2个Pin连接时,必须有一个Pin提供Allocator | |
IMediaSample接口(引用计数!) | |
构建Filter Graph | |
IGraphBuilder接口 | |
Connect:连接2个Pin,如果需要的话,中间加入其他Filter | |
ConnectDirect | |
!Render:从某个输出Pin开始,完成余下的Graph构建 | |
RenderFile | |
AddFilter | |
=> 可以支持由应用程序构建整个Graph(qt似乎就是这么做的?) | |
Filter的Merit值? | |
先AddFilter,然后枚举其上的Pin’s,调用Connect/ConnectDirect | |
智能连接 | |
AddSourceFilter --> 立即调用Load()? | |
要连接每一个输出Pin: | |
如果Pin支持IStreamBuilder,则。。。 | |
尝试使用任何在缓存中的Filter | |
如果Filter Graph包含了有未连接输入Pin的Filter,则优先使用之(因此可在之前AddFilter定制的...) | |
最后,使用IFilterMapper2::EnumMatchingFilters... | |
数据流在Filter Graph中的流动 | |
IMediaSample -> Buffer | |
GetSize | |
GetActualDataLength | |
GetPointer | |
IMemAllocator -> Pool of Samples(实际上这里的Buffer池实现了自动的速率抑制匹配!) | |
Commit/Decommit? | |
多个Allocator等待Sample的情况:存在互锁状态? | |
FIlter状态 | |
停止 -> 就绪 -> 运行 | |
实时源(Live Source):不适合提前准备数据 | |
拉模式 | |
IAsyncReader | |
Request 由输入Pin调用(异步) | |
SyncRead 同步 | |
SyncReadAligned | |
?理论上任何Filter都能支持IAsyncReader,但实际上它仅仅在连接有一个Parser Filter的Source Filter上使用 | |
事件通知机制(Filter通知Graph Manager) | |
IMediaEventSink | |
Notify | |
IMediaEvent(Ex) | |
GetEvent -> FreeEventParams | |
Cancel/RestoreEventDefaultHandling | |
(窗口通知)SetNotifyWindow:WM_APP~0xBFFF | |
(事件信号)GetEventHandle——这是qt使用的方式(灵活性更大?) | |
then WaitForSingleObject(hEvent, msWaitTimeout)! | |
事件通知码 | |
EC_ACTIVATE | |
EC_COMPLETE | |
EC_DISPLAY/PALETTE_CHANGED | |
EC_REPAINT | |
EC_USERABORT | |
EC_VIDEO_SIZE_CHANGED | |
EC_WINDOW_DESTROYED | |
时间的意义 | |
IReferenceClock::GetTime:只反应Graph开始时的相对时间 | |
默认* | |
设置:IMediaFilter::SetSyncSource | |
参考时间 VS 流时间 | |
时间戳 | |
从Preview Pin出来的没有时间戳 | |
实时源(Live Source):暂略 | |
*速率匹配 | |
动态重建可靠吗 | |
Filter要支持动态重连*,则其: | |
输入Pin对应的Filter须支持IPinFlowControl | |
输出Pin对应的Filter须支持IPinConnection | |
Filter链(IFilterChain) | |
剖析SDK基类源码 | |
BaseClasses中COM相关的: | |
CBaseObject | |
CUnknown | |
... | |
与Pin相关的: | |
IPin | |
IQualityControl | |
CBasePin | |
CBaseFilter | |
CSource | |
CTransformFilter | |
CBaseRenderer | |
CBaseAllocator | |
开发一个视频播放器 | |
DirectShow基本应用 | |
视频提交 | |
枚举系统的设备和过滤器 | |
连接2个Filter | |
获取Pin | |
查找与某个Filter的上下相连的Filter | |
编写自己的Filter | |
VFW实现视频处理 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
如果要定制一个VideoOutput Renderer Filter,以获取到解码后的每帧图像,则QueryAccept这个API还是很重要的:它必须对它感兴趣的AM_MEDIA_TYPE回答S_OK,其他的FALSE,这样FilterGraph Builder才能据此把它放到合适的位置。