Skip to content

Instantly share code, notes, and snippets.

@chenzx
Created July 12, 2014 16:26
Show Gist options
  • Save chenzx/b50b408449a5a68bc78a to your computer and use it in GitHub Desktop.
Save chenzx/b50b408449a5a68bc78a to your computer and use it in GitHub Desktop.
Visual C++音频视频技术开发与实践 笔记
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实现视频处理
@chenzx
Copy link
Author

chenzx commented Jul 20, 2014

如果要定制一个VideoOutput Renderer Filter,以获取到解码后的每帧图像,则QueryAccept这个API还是很重要的:它必须对它感兴趣的AM_MEDIA_TYPE回答S_OK,其他的FALSE,这样FilterGraph Builder才能据此把它放到合适的位置。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment