Directshow in Python

Thomas Heller theller at python.net
Fri Sep 19 08:43:17 CEST 2008


Sayanan Sivaraman schrieb:
> Hey all,
> 
> I'm trying to use DirectShow to display videos [I'm kind of new to
> Python, from more of a C++ background on windows].  I found some
> sample code online, but I am having trouble with calling the I
> 
> import ctypes
> from ctypes import *
> from comtypes import client
> from ctypes.wintypes import *
> import sys
> import time
> 
> 
> filename = sys.argv[1]
> 
> 
> qedit = client.GetModule('qedit.dll') # DexterLib
> quartz= client.GetModule("quartz.dll")
> 
> 
> CLSID_FilterGraph = '{e436ebb3-524f-11ce-9f53-0020af0ba770}'
> filter_graph =
> client.CreateObject(CLSID_FilterGraph,interface=qedit.IFilterGraph)
> filter_builder = filter_graph.QueryInterface(qedit.IGraphBuilder)
> filter_builder.RenderFile(filename, None)
> 
> media_control = filter_graph.QueryInterface(quartz.IMediaControl)
> media_control.Run()
> 
> try:
>     # Look at IMediaEvent interface for EOS notification
>     while True:
>         time.sleep(1)
> except KeyboardInterrupt:
>     pass
> 
> # Need these because finalisers don't have enough context to clean up
> after
> # themselves when script exits.
> del media_control
> del filter_builder
> del filter_graph
> 
> This code works fine.  What I would like to know, is how do I declare
> filename in the Python program to be of type LPCWSTR, so that I don't
> need to parse the command line in order to call the function
> "RenderFile()"?

If I understand your question correctly (I'm no sure):  comtypes converts
Python strings or unicode strings to the required LPCWSTR type itself.
So, you can call
  filter_builder.RenderFile("c:\\windows\\clock.avi", None)
or
  filter_builder.RenderFile(u"c:\\windows\\clock.avi", None)

If you pass a string, comtypes converts it to unicode using the "mbcs"
codec; this can be changed by setting ctypes.conversion_mode.

Thomas



More information about the Python-list mailing list