0
我想爲基於GMFBridge和DirectShow的視頻播放器製作時間碼計數器。我可以從directshow視頻獲取時間碼嗎?
我正在使用計時器每200ms調用一次GetCurrentPosition(),但我認爲這不準確。我希望至少在視頻運行時獲取當前幀的幀號(從開始)。
這實際上可以做到嗎?
我正在使用DirectShowLib .NET庫。
我想爲基於GMFBridge和DirectShow的視頻播放器製作時間碼計數器。我可以從directshow視頻獲取時間碼嗎?
我正在使用計時器每200ms調用一次GetCurrentPosition(),但我認爲這不準確。我希望至少在視頻運行時獲取當前幀的幀號(從開始)。
這實際上可以做到嗎?
我正在使用DirectShowLib .NET庫。
據我所知,這是很難實現的,在一個解決方案,我對我的工作做了以下獲得「幀數」:
// Get the media type from the SampleGrabber
AMMediaType media = new AMMediaType();
hr = sampGrabber.GetConnectedMediaType(media);
DsError.ThrowExceptionForHR(hr);
if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero))
{
throw new NotSupportedException("Unknown Grabber Media Format");
}
// Grab the size info
videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
DsUtils.FreeAMMediaType(media);
:
public int NumberOfFrames
{
get
{
return (int)(Duration/AverageTimePerFrame);
}
}
public double AverageTimePerFrame
{
get
{
return videoInfoHeader.AvgTimePerFrame/10000000.0;
}
}
public int GetCurrentFrame(double currentTime)
{
int noOfFrames = (int)(Duration/AverageTimePerFrame);
return Convert.ToInt32(Math.Min(noOfFrames - 1, Math.Floor(currentTime/AverageTimePerFrame)));
}
我做得到了VIDEOINFOHEADER
但是,這顯然是適合我自己的用例,希望它可以幫助你一點點。祝你好運!
更新 新增CURRENTTIME代碼(更衣室是我自己的使用情況,您可以最有可能刪除):
public double CurrentTime
{
set
{
lock (locker)
{
IMediaPosition mediaPos = fFilterGraph as IMediaPosition;
int hr;
if (value >= 0 && value <= Duration)
{
hr = mediaPos.put_CurrentPosition(value);
DsError.ThrowExceptionForHR(hr);
}
}
}
get
{
lock (locker)
{
IMediaPosition mediaPos = fFilterGraph as IMediaPosition;
int hr;
double currentTime;
hr = mediaPos.get_CurrentPosition(out currentTime);
DsError.ThrowExceptionForHR(hr);
return currentTime;
}
}
}
感謝丹尼斯,你怎麼currentTime的? – DaveO 2011-03-16 04:41:52
查看更新;-) – 2011-03-17 07:10:32
這個工作適合你DaveO? – 2011-03-19 02:28:40