Click here to Skip to main content
15,885,546 members
Articles / Multimedia / DirectX

Seeking and getting the position snippets for DirectShow.NET

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
14 Feb 2008CPOL 36.4K   23   3
How to seek and get the position and duration for your DirectShow movie with VB.NET.

Introduction

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?

Background

Please read the related articles here:

Using the code

When you have created your graph like this:

VB
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
        Try
            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)
            DsError.ThrowExceptionForHR(hr)
        Catch ex As Exception
            ThrowError("error sub graph_seek : ", ex)
            'throwerror is my custom messagehandler
        End Try
    Else
        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)
        del.Invoke(frame,duration)
    Else
        Process_Trackbar_playhead_update(frame,duration)
    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)
        TrackbarPlayhead.Update()
        Application.DoEvents()
    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):

VB
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.

History

No history yet.

License

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


Written By
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 directshow.net , then you can read some chunks of info on my blog , with some extra handy links to more articles and forums.

http://jarnoburger.blogspot.com/

Comments and Discussions

 
QuestionWish this article is not in VB Pin
Frank W. Wu15-Jul-12 5:02
Frank W. Wu15-Jul-12 5:02 
Questiontwo video overlay question Pin
yhw1985040124-Apr-08 19:58
yhw1985040124-Apr-08 19:58 
GeneralRe: two video overlay question Pin
Jarno Burger24-Apr-08 21:43
Jarno Burger24-Apr-08 21:43 

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

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