Simpler VideoPlayer unter Verwendung des MS-MediaPlayers
Verfasst: 26.08.2006 13:49
Soll jetzt keine fertige Anwendung sein, sondern nur als Anregung und
Beispiel, wie man COM nutzen kann. Ausserdem möchte ich damit auch
gleich auf den hervorragenden OLE/COM Interface generator von Stefan
Moebius aufmerksam machen:
http://www.purebasic.fr/english/viewtopic.php?t=23370
PS: Alle unbenutzen Interfaces etc. hab ich entfernt
Beispiel, wie man COM nutzen kann. Ausserdem möchte ich damit auch
gleich auf den hervorragenden OLE/COM Interface generator von Stefan
Moebius aufmerksam machen:
http://www.purebasic.fr/english/viewtopic.php?t=23370
PS: Alle unbenutzen Interfaces etc. hab ich entfernt
Code: Alles auswählen
; Simpler Fullscreen Video Player
; basiert auf Beispiel von Stefan Moebius
; Interface generiert mit OLE/COM Interface generator
; by Stefam Moebius
; http://www.purebasic.fr/english/viewtopic.php?t=23370
;
; und ein paar Zeilen von mir :)
; zur freien Verwendung
; Beenden mit ESC (bei Videoende autom.)
; linker Mausclick Pause/PauseOff
; Video kann als parameter übergeben werden,
; ansonsten erscheint Dateiauswahldialog
; UNICODE-Support
EnableExplicit
; wir benötigen nur das eine Interface
Interface IMediaPlayer ; IMediaPlayer Interface
QueryInterface(riid.l,ppvObj.l)
AddRef()
Release()
GetTypeInfoCount(pctinfo.l)
GetTypeInfo(itinfo.l,lcid.l,pptinfo.l)
GetIDsOfNames(riid.l,rgszNames.l,cNames.l,lcid.l,rgdispid.l)
Invoke(dispidMember.l,riid.l,lcid.l,wFlags.l,pdispparams.l,pvarResult.l,pexcepinfo.l,puArgErr.l)
get_CurrentPosition(dispidMember.l)
put_CurrentPosition(dispidMember.d)
get_Duration(dispidMember.l)
get_ImageSourceWidth(dispidMember.l)
get_ImageSourceHeight(dispidMember.l)
get_MarkerCount(dispidMember.l)
get_CanScan(dispidMember.l)
get_CanSeek(dispidMember.l)
get_CanSeekToMarkers(dispidMember.l)
get_CurrentMarker(dispidMember.l)
put_CurrentMarker(dispidMember.l)
get_FileName(dispidMember.l)
put_FileName(dispidMember.p-bstr)
get_SourceLink(dispidMember.l)
get_CreationDate(dispidMember.l)
get_ErrorCorrection(dispidMember.l)
get_Bandwidth(dispidMember.l)
get_SourceProtocol(dispidMember.l)
get_ReceivedPackets(dispidMember.l)
get_RecoveredPackets(dispidMember.l)
get_LostPackets(dispidMember.l)
get_ReceptionQuality(dispidMember.l)
get_BufferingCount(dispidMember.l)
get_IsBroadcast(dispidMember.l)
get_BufferingProgress(dispidMember.l)
get_ChannelName(dispidMember.l)
get_ChannelDescription(dispidMember.l)
get_ChannelURL(dispidMember.l)
get_ContactAddress(dispidMember.l)
get_ContactPhone(dispidMember.l)
get_ContactEmail(dispidMember.l)
get_BufferingTime(dispidMember.l)
put_BufferingTime(dispidMember.d)
get_AutoStart(dispidMember.l)
put_AutoStart(dispidMember.w)
get_AutoRewind(dispidMember.l)
put_AutoRewind(dispidMember.w)
get_Rate(dispidMember.l)
put_Rate(dispidMember.d)
get_SendKeyboardEvents(dispidMember.l)
put_SendKeyboardEvents(dispidMember.w)
get_SendMouseClickEvents(dispidMember.l)
put_SendMouseClickEvents(dispidMember.w)
get_SendMouseMoveEvents(dispidMember.l)
put_SendMouseMoveEvents(dispidMember.w)
get_PlayCount(dispidMember.l)
put_PlayCount(dispidMember.l)
get_ClickToPlay(dispidMember.l)
put_ClickToPlay(dispidMember.w)
get_AllowScan(dispidMember.l)
put_AllowScan(dispidMember.w)
get_EnableContextMenu(dispidMember.l)
put_EnableContextMenu(dispidMember.w)
get_CursorType(dispidMember.l)
put_CursorType(dispidMember.l)
get_CodecCount(dispidMember.l)
get_AllowChangeDisplaySize(dispidMember.l)
put_AllowChangeDisplaySize(dispidMember.w)
get_IsDurationValid(dispidMember.l)
get_OpenState(dispidMember.l)
get_SendOpenStateChangeEvents(dispidMember.l)
put_SendOpenStateChangeEvents(dispidMember.w)
get_SendWarningEvents(dispidMember.l)
put_SendWarningEvents(dispidMember.w)
get_SendErrorEvents(dispidMember.l)
put_SendErrorEvents(dispidMember.w)
get_PlayState(dispidMember.l)
get_SendPlayStateChangeEvents(dispidMember.l)
put_SendPlayStateChangeEvents(dispidMember.w)
get_DisplaySize(dispidMember.l)
put_DisplaySize(dispidMember.l)
get_InvokeURLs(dispidMember.l)
put_InvokeURLs(dispidMember.w)
get_BaseURL(dispidMember.l)
put_BaseURL(dispidMember.p-bstr)
get_DefaultFrame(dispidMember.l)
put_DefaultFrame(dispidMember.p-bstr)
get_HasError(dispidMember.l)
get_ErrorDescription(dispidMember.l)
get_ErrorCode(dispidMember.l)
get_AnimationAtStart(dispidMember.l)
put_AnimationAtStart(dispidMember.w)
get_TransparentAtStart(dispidMember.l)
put_TransparentAtStart(dispidMember.w)
get_Volume(dispidMember.l)
put_Volume(dispidMember.l)
get_Balance(dispidMember.l)
put_Balance(dispidMember.l)
get_ReadyState(dispidMember.l)
get_SelectionStart(dispidMember.l)
put_SelectionStart(dispidMember.d)
get_SelectionEnd(dispidMember.l)
put_SelectionEnd(dispidMember.d)
get_ShowDisplay(dispidMember.l)
put_ShowDisplay(dispidMember.w)
get_ShowControls(dispidMember.l)
put_ShowControls(dispidMember.w)
get_ShowPositionControls(dispidMember.l)
put_ShowPositionControls(dispidMember.w)
get_ShowTracker(dispidMember.l)
put_ShowTracker(dispidMember.w)
get_EnablePositionControls(dispidMember.l)
put_EnablePositionControls(dispidMember.w)
get_EnableTracker(dispidMember.l)
put_EnableTracker(dispidMember.w)
get_Enabled(dispidMember.l)
put_Enabled(dispidMember.w)
get_DisplayForeColor(dispidMember.l)
put_DisplayForeColor(dispidMember.l)
get_DisplayBackColor(dispidMember.l)
put_DisplayBackColor(dispidMember.l)
get_DisplayMode(dispidMember.l)
put_DisplayMode(dispidMember.l)
get_VideoBorder3D(dispidMember.l)
put_VideoBorder3D(dispidMember.w)
get_VideoBorderWidth(dispidMember.l)
put_VideoBorderWidth(dispidMember.l)
get_VideoBorderColor(dispidMember.l)
put_VideoBorderColor(dispidMember.l)
get_ShowGotoBar(dispidMember.l)
put_ShowGotoBar(dispidMember.w)
get_ShowStatusBar(dispidMember.l)
put_ShowStatusBar(dispidMember.w)
get_ShowCaptioning(dispidMember.l)
put_ShowCaptioning(dispidMember.w)
get_ShowAudioControls(dispidMember.l)
put_ShowAudioControls(dispidMember.w)
get_CaptioningID(dispidMember.l)
put_CaptioningID(dispidMember.p-bstr)
get_Mute(dispidMember.l)
put_Mute(dispidMember.w)
get_CanPreview(dispidMember.l)
get_PreviewMode(dispidMember.l)
put_PreviewMode(dispidMember.w)
get_HasMultipleItems(dispidMember.l)
get_Language(dispidMember.l)
put_Language(dispidMember.l)
get_AudioStream(dispidMember.l)
put_AudioStream(dispidMember.l)
get_SAMIStyle(dispidMember.l)
put_SAMIStyle(dispidMember.p-bstr)
get_SAMILang(dispidMember.l)
put_SAMILang(dispidMember.p-bstr)
get_SAMIFileName(dispidMember.l)
put_SAMIFileName(dispidMember.p-bstr)
get_StreamCount(dispidMember.l)
get_ClientId(dispidMember.l)
get_ConnectionSpeed(dispidMember.l)
get_AutoSize(dispidMember.l)
put_AutoSize(dispidMember.w)
get_EnableFullScreenControls(dispidMember.l)
put_EnableFullScreenControls(dispidMember.w)
get_ActiveMovie(dispidMember.l)
get_NSPlay(dispidMember.l)
get_WindowlessVideo(dispidMember.l)
put_WindowlessVideo(dispidMember.w)
Play()
Stop()
Pause()
GetMarkerTime(MarkerNum.l)
GetMarkerName(MarkerNum.l)
AboutBox()
GetCodecInstalled(CodecNum.l)
GetCodecDescription(CodecNum.l)
GetCodecURL(CodecNum.l)
GetMoreInfoURL(MoreInfoType.l)
GetMediaInfoString(MediaInfoType.l)
Cancel()
Open(bstrFileName.p-bstr)
IsSoundCardEnabled()
Next()
Previous()
StreamSelect(StreamNum.l)
FastForward()
FastReverse()
GetStreamName(StreamNum.l)
GetStreamGroup(StreamNum.l)
GetStreamSelected(StreamNum.l)
EndInterface
Import "atl.lib"
AtlAxWinInit()
AtlAxCreateControl(lpszName.p-bstr,hWnd.l,*pStream.IStream,*ppUnkContainer.IUnknown)
AtlAxGetControl(hWnd.l,*pp.IUnknown)
EndImport
Import "shell32.lib"
CompilerIf #PB_Compiler_Unicode
SHGetSpecialFolderPath_(hwndOwner.l, lpszPath.s, nFolder.l, fCreate.l) As "_SHGetSpecialFolderPathW@16"
CompilerElse
SHGetSpecialFolderPath_(hwndOwner.l, lpszPath.s, nFolder.l, fCreate.l) As "_SHGetSpecialFolderPathA@16"
CompilerEndIf
EndImport
Procedure.s GetSpecialFolder(Folder.l)
Protected Path.s = Space(#MAX_PATH)
If SHGetSpecialFolderPath_(#NUL, Path, Folder, #NUL)
If Right(Path, 1) <> "\" : Path + "\" : EndIf
ProcedureReturn Path
EndIf
EndProcedure
Define.s File
Define.IMediaPlayer *mp
Define.d dur, pos
File = ProgramParameter()
If FileSize(File) <= 0 Or File = ""
File = OpenFileRequester("Small MediaPlayer", GetSpecialFolder(#CSIDL_MYVIDEO) + "*.wmv", "*.*", 0)
If Not File : End : EndIf
EndIf
CoInitialize_(0)
AtlAxWinInit()
#Flags=#PB_Window_Invisible|#PB_Window_BorderLess
ExamineDesktops()
If OpenWindow(0, #PB_Ignore, 0, DesktopWidth(0), DesktopHeight(0),"Simple MediaPlayer, written in PB", #Flags) = #False : End : EndIf
AtlAxCreateControl("MediaPlayer.MediaPlayer.1", WindowID(0), 0, 0)
AtlAxGetControl(WindowID(0),@*mp.IMediaPlayer)
*mp\put_AnimationAtStart(#False)
*mp\put_EnableContextMenu(#False)
*mp\put_ShowControls(#False)
*mp\put_FileName(File)
*mp\get_Duration(@dur)
HideWindow(0, #False)
Repeat
Select WaitWindowEvent(100)
Case #PB_Event_CloseWindow
Break
Default
*mp\get_CurrentPosition(@pos)
If pos = dur : Break : EndIf
If GetAsyncKeyState_(#VK_ESCAPE) : Break : EndIf
EndSelect
ForEver
*mp\Release()
CloseWindow(0)