Click here to Skip to main content
Click here to Skip to main content

Seeking and getting the position snippets for DirectShow.NET

, 14 Feb 2008 CPOL
Rate this:
Please Sign up or sign in to vote.
How to seek and get the position and duration for your DirectShow movie with VB.NET.


Did you ever want to seek through your DirectShow movie? Or get the current position of your movie and want to show that using your trackbar?


Please read the related articles here:

Using the code

When you have created your graph like this:

f_MediaPositioning = CType(f_GraphManager, IMediaSeeking) '(f_graphmanager is the base) 
Public Event Movie_Playhead_Moved(ByVal frame as long, duration as long)
Public Sub Graph_Seek(ByVal frame As Long)
    If FilterGraphState = FilterGraphStateEnum.Ready Then
            Dim hr As Integer
            Dim duration As Long
            hr = f_MediaPositioning.GetDuration(duration) : DsError.ThrowExceptionForHR(hr)
            hr = f_MediaPositioning.SetPositions(frame, _
                    AMSeekingSeekingFlags.AbsolutePositioning, _
                    duration, AMSeekingSeekingFlags.AbsolutePositioning)
            RaiseEvent Movie_Playhead_Moved(frame , duration)
        Catch ex As Exception
            ThrowError("error sub graph_seek : ", ex)
            'throwerror is my custom messagehandler
        End Try
        ThrowError("not ready to do seeking")
    End If
End Sub

Private Sub HeANewPlayheadEvent(byval frame as long, _
            byval duration as long) handles me.Movie_Playhead_Moved
    Invoke_trackbar_playhead_update(frame, duration)
End Sub

Public Sub Invoke_trackbar_playhead_update(ByVal frame as long, duration as long)
    If Me.TrackbarPlayhead.InvokeRequired Then
        Dim del As New Delegate_Trackbar_Playhead_Update(_
                       AddressOf Process_Trackbar_playhead_update)
    End If
End Sub

Private Sub Process_Trackbar_playhead_update(ByVal frame As long, ByVal duration As long)
    If TrackbarPlayhead.Value <> frame Then
        TrackbarPlayhead.Maximum = Cint(duration / 1000)
        TrackbarPlayhead.Value = CInt(frame / 1000)
        TrackbarPlayhead.TickFrequency = CInt(duration / 10)
    End If
End Sub

you can have a separate sub that is called by a timer (whenever your graph is loaded and is in play/pause mode):

Dim hr As Integer:Dim frame As Long
hr = f_MediaPositioning.GetCurrentPosition(frame) : DsError.ThrowExceptionForHR(hr)
hr = f_MediaPositioning.GetDuration(duration) : DsError.ThrowExceptionForHR(hr)
Invoke_trackbar_playhead_update(frame, duration)     

You can use the IMediaSeeking interface to control the rate of your movie.


No history yet.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Jarno Burger

Netherlands Netherlands
Jarno Burger
i am videojockey for festivals.
i am getting fed up with the vj programs at the moment , so i am trying to go and write my own one.
if you wanna read some more stuff about , then you can read some chunks of info on my blog , with some extra handy links to more articles and forums.

Comments and Discussions

QuestionWish this article is not in VB PinmemberFrank W. Wu15-Jul-12 6:02 
Questiontwo video overlay question Pinmemberyhw1985040124-Apr-08 20:58 
GeneralRe: two video overlay question PinmemberJarno Burger24-Apr-08 22:43 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.1411022.1 | Last Updated 14 Feb 2008
Article Copyright 2008 by Jarno Burger
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid