2011-03-08 70 views
0

我想爲基於GMFBridge和DirectShow的視頻播放器製作時間碼計數器。我可以從directshow視頻獲取時間碼嗎?

我正在使用計時器每200ms調用一次GetCurrentPosition(),但我認爲這不準確。我希望至少在視頻運行時獲取當前幀的幀號(從開始)。

這實際上可以做到嗎?

我正在使用DirectShowLib .NET庫。

回答

1

據我所知,這是很難實現的,在一個解決方案,我對我的工作做了以下獲得「幀數」:

// 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; 
     } 
    } 
} 
+0

感謝丹尼斯,你怎麼currentTime的? – DaveO 2011-03-16 04:41:52

+0

查看更新;-) – 2011-03-17 07:10:32

+0

這個工作適合你DaveO? – 2011-03-19 02:28:40