本文整理汇总了C#中ISampleGrabber.GetCurrentBuffer方法的典型用法代码示例。如果您正苦于以下问题:C# ISampleGrabber.GetCurrentBuffer方法的具体用法?C# ISampleGrabber.GetCurrentBuffer怎么用?C# ISampleGrabber.GetCurrentBuffer使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ISampleGrabber
的用法示例。
在下文中一共展示了ISampleGrabber.GetCurrentBuffer方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetBitmap
private static Bitmap GetBitmap(IGraphBuilder graph, ISampleGrabber sg, long grabPosition, out EventCode ec)
{
IntPtr pBuffer = IntPtr.Zero;
int pBufferSize = 0;
Bitmap b = null;
int hr = 0;
try
{
IMediaSeeking ims = graph as IMediaSeeking;
bool canDuration = false;
bool canPos = false;
bool canSeek = false;
long pDuration = 0;
long pCurrent = 0;
if (ims != null)
{
AMSeekingSeekingCapabilities caps;
hr = ims.GetCapabilities(out caps);
if ((caps & AMSeekingSeekingCapabilities.CanGetDuration) == AMSeekingSeekingCapabilities.CanGetDuration)
canDuration = true;
if ((caps & AMSeekingSeekingCapabilities.CanGetCurrentPos) == AMSeekingSeekingCapabilities.CanGetCurrentPos)
canPos = true;
if ((caps & AMSeekingSeekingCapabilities.CanSeekAbsolute) == AMSeekingSeekingCapabilities.CanSeekAbsolute)
canSeek = true;
if (canDuration)
hr = ims.GetDuration(out pDuration);
if (grabPosition > pDuration)
grabPosition = pDuration - 1;
if (canSeek)
{
hr = ims.SetPositions(new DsLong(grabPosition), AMSeekingSeekingFlags.AbsolutePositioning, 0, AMSeekingSeekingFlags.NoPositioning);
DsError.ThrowExceptionForHR(hr);
}
if (canPos)
hr = ims.GetCurrentPosition(out pCurrent);
}
if (canPos)
hr = ims.GetCurrentPosition(out pCurrent);
IMediaControl mControl = graph as IMediaControl;
IMediaEvent mEvent = graph as IMediaEvent;
//ec = EventCode.SystemBase;
hr = mControl.Pause();
DsError.ThrowExceptionForHR(hr);
hr = mControl.Run();
DsError.ThrowExceptionForHR(hr);
hr = mEvent.WaitForCompletion(int.MaxValue, out ec);
DsError.ThrowExceptionForHR(hr);
hr = mControl.Pause();
DsError.ThrowExceptionForHR(hr);
hr = mControl.Stop();
DsError.ThrowExceptionForHR(hr);
if (ec != EventCode.Complete)
return null;
hr = sg.GetCurrentBuffer(ref pBufferSize, pBuffer);
DsError.ThrowExceptionForHR(hr);
pBuffer = Marshal.AllocCoTaskMem(pBufferSize);
hr = sg.GetCurrentBuffer(ref pBufferSize, pBuffer);
DsError.ThrowExceptionForHR(hr);
if (pBuffer != IntPtr.Zero)
{
AMMediaType sgMt = new AMMediaType();
int videoWidth = 0;
int videoHeight = 0;
int stride = 0;
try
{
hr = sg.GetConnectedMediaType(sgMt);
DsError.ThrowExceptionForHR(hr);
if (sgMt.formatPtr != IntPtr.Zero)
{
if (sgMt.formatType == FormatType.VideoInfo)
{
VideoInfoHeader vih = (VideoInfoHeader)Marshal.PtrToStructure(sgMt.formatPtr, typeof(VideoInfoHeader));
videoWidth = vih.BmiHeader.Width;
videoHeight = vih.BmiHeader.Height;
stride = videoWidth * (vih.BmiHeader.BitCount / 8);
}
//.........这里部分代码省略.........