Click here to Skip to main content
15,886,799 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 
I want to achieve two video overlay:
The establishment of a Transformfilter, and a heavy interface Inputpin come (based on CBaseInputPin), but the stack of incoming Inputpin receive pSample will keep receiving the reception, and did not follow the normal speed receiver, to identify the reason for this is that Permian Increase coming in this video Render does not control its speed, so it kept the moment to transmit data, I originally wanted to add sleep() in Receive function, but can not solve fundamental problems, the use of sleep() can not achieve the video overlay IMediaSeeking video interface, brought up a lot of problems. so do say, overlay video can't control the speed and seeking, the overlay video input to the main video throught the input pin (based on CBaseInputpin),how can I do ,please help
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.