Code archives/User Libs/MciSendString
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This was written initially by Sswift for a DLL wrapper. I have edited it so it works directly with a winmm.decls userlib. Quote of Sswift to Coppercircle: "Hey Coppercircle... Maybe you should post this in the code archives?" ( from here ) , so I think it's ok to post it in the Archive. | |||||
; MCI Wrapper - Written by Shawn C. Swift ; To use this system to display an AVI, you will need to call mciOpen, then mciWindow, then mciPlay. ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function opens a new mci device. ; ; DeviceName$ will be the name which you use to give the device commands later. ; ; Device should be one of the following: ; ; 0 = "cdaudio" - For playing tracks on a CD. ; 1 = "AVIVideo" - For playing AVI and other video files. ; 2 = "sequencer" - For playing MIDI files. ; 3 = "waveaudio" - For playing WAV files. ; ; Filename$ is an optional parameter to specify the file you wish to be loaded when the device is created. ; I don't think the mciLoad command can load audio later though, so for WAV files, you might have to use filename here. ; ------------------------------------------------------------------------------------------------------------------------------------- ; partially edited by jfk of csp ;... ; you need these userlib decls in "winmm.decls" : ; *********************************************** ;.lib "winmm.dll" ; this is a standard windows file ;mciExecute%(Text$) ;mciSendString%(Command$,ReturnString*,ReturnLength%,Callback):"mciSendStringA" ; for more infos about MciSendString Commands goto msdn.com and search for "MciSendString" Global ScreenWidth=1024 Global ScreenHeight=768 Graphics ScreenWidth,ScreenHeight,32,1 SetBuffer FrontBuffer() Global generic_bank=CreateBank(4096) ; used for Mci answers device_name$="AVIVideo" +MilliSecs()+Rand(100) ; create a unique handle to allow multiple movies myHWND=SystemProperty$("AppHWND") mciOpen(device_name$,"csp_intro_2005mp4.avi") mciWindow(device_name$,myHWND) ; hook movie on blitz frontbuffer (requires fullscreen) mciSize(device_name$, 10,10,320,240) ; scale and position as desired mciSetAudioVolume(device_name$,500) ;0 to 1000... don't works! (only alters the main Volume, instead of movie volume!) mciSet(device_name$,"seek exactly on") ; turn on "seek exactly" mciSet(device_name$,"time format frames") movie_length=mciStatus(device_name$,"length") mciPlay(device_name$,"repeat") ; start playing, with loop option t1=MilliSecs()+100000 While (KeyDown(1)=0) And (MilliSecs()<t1) Delay 10 cuf=mciStatus(device_name$,"position") ; get current frame number Color 0,0,0 Rect 0,400,300,30,1 Color 0,255,0 Locate 0,400 Print cuf+" of "+movie_length+" Frames" ; you may capture frames using copyrect on the frontbuffer in fullscreen mode... Wend mciStop(device_name$) mciClose(device_name$) ; never forget this WaitKey() End ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciUpdate(DeviceName$,dc) mciSendString("update " + DeviceName$ + " hdc "+dc,generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciOpen(DeviceName$, FileName$="") Local hWND Local DeviceType$ mciSendString("OPEN " + FileName$ + " TYPE AVIVIDEO ALIAS "+DeviceName$+" STYLE POPUP",generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function sets the window which an mci device should display its media in and the display properties for that window. ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciWindow(DeviceName$, Parent) Local hWND hWND = Parent ;QueryObject(Parent, 1) mciSendString("window " + DeviceName$ + " handle " + Str$(hWND),generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function loads a file into an mci digital-video or video-overlay device. ; I don't think it will load waveaudio, which is why I included the optional filename parameter on the mciOpen command. ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciLoad(DeviceName$, FileName$) mciSendString("load " + DeviceName$ + " " + FileName$,generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function changes the settings of an mci digital-video device, if said device supports them. ; (Mine does not.) ; ; Here are the settings you can use for Option$: ; ; "brightness" - 0..1 ; "color" - 0..1 ; "contrast" - 0..1 ; "tint" - 0.0 = Blue, 0.25 = Green, 0.5 = Normal, 0.75 = Red, 1.0 = Blue ; "sharpness" - 0..1 ; "gamma" - 1.0 = No gamma correction, 2.2 = Windows gamma ; ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciSetVideo(DeviceName$, Option$, Value#=0) ;mciSendString("setvideo " + DeviceName$ + " " + Option$ + " to " + Int(Value#*1000.0)) mciSendString("setvideo " + DeviceName$ + " brightness to 100",generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function changes certain settings of the specified mci device. ; ; The following options may be specified. Multiple options can be seperated with a space. ; ; "audio all off" - Turns off audio. ; "audio all on" - Turns on audio. ; ; "door open" - Opens the cd door. ; "door closed" - Closes the cd door. ; ; "seek exactly on" - Enables seeking to the exact frame specified. ; "seek exactly off" - When seeking, seeks only to the nearest keyframe. (Presumed to be faster.) ; ; "speed FACTOR" - Sets the speed of playback, where FACTOR is the desired multiple of the normal speed multiplied by 1000. ; Ie, 1.0, the normal speed, becomes 1000. 2.0, twice normal speed becomes 2000. And 0.5 becomes 500. ; FACTOR must be an integer. A speed of 0 plays back the video as fast as possible without dropping ; frames, but without audio. ; ; "time format FORMAT" - Sets the format for time used by the seek command. ; ; Where FORMAT is the following: ; ; For digital-video: "frames" or "milliseconds" ; ; For CD-audio: "msf" or "tmsf" which are in the format: ; "minutes:seconds:frames" or "tracks:minutes:seconds:frames" where the max values for each are: ; "99:59:74" and "99:99:59:74" ; ; For wavaudio: "bytes", "milliseconds", or "samples" ; ; For sequencer: "milliseconds" ; ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciSet(DeviceName$, Option$) mciSendString("set " + DeviceName$ + " " + Option$,generic_bank,0,0) End Function ; added by jfk: Function mciSetAudioVolume(DeviceName$, volume,tp$="",nr=0) PokeInt generic_bank,0,0 If volume< 0 Then volume=0 If volume>1000 Then volume=1000 mciSendString("setaudio " + DeviceName$ + " volume to " + volume,generic_bank,4,0) Return PeekInt(generic_bank,0) End Function ; added by jfk: Function mciSize(DeviceName$, x,y,w,h) mciSendString("put " + DeviceName$ + " destination at " +x+" "+y+" "+w+" "+h,generic_bank,0,0) End Function Function mciCapability(DeviceName$, feature$) PokeInt generic_bank,0,0 mciSendString("capability " + DeviceName$ + " "+feature$,generic_bank,4,0) Return PeekInt(generic_bank,0) End Function Function mciGetDeviceType$(DeviceName$) For i=0 To 1001 PokeByte generic_bank,i,0 Next mciSendString("capability " + DeviceName$ + " device type",generic_bank,100,0) ret$="" Repeat pp=PeekByte(generic_bank,c) If pp<>0 Then ret$=ret$+Chr$(pp) EndIf c=c+1 Until (pp=0) Or (c>1000) Return ret$ End Function Function mciStatus$(DeviceName$,what$) For i=0 To 1001 PokeByte generic_bank,i,0 Next mciSendString("status " + DeviceName$ + " "+what$,generic_bank,100,0) ret$="" Repeat pp=PeekByte(generic_bank,c) If pp<>0 Then ret$=ret$+Chr$(pp) EndIf c=c+1 Until (pp=0) Or (c>1000) Return ret$ End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function plays the specified mci device. ; ; Option may be set to the following: ; ; "fullscreen" - Sets the video to full screen. Uncompressed video will not play in full screen. ; "window" - Sets the video the play back in it's parent window. ; "repeat" - Restarts playback from the beginning once it reaches the end. ; "reverse" - Specifies that the video plays back backwards. ; ; "from POSITION" - Specifies that the video plays back starting at the position specified. ; "from POSITION1 to POSITION2" - Specifies that the video plays from point A to point B. (Cannot be used with reverse.) ; ; You may specify more than one option at a time if you seperate each with a space. ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciPlay(DeviceName$, Option$="") If Option$ <> "" mciSendString("play " + DeviceName$ + " " + Option$,generic_bank,0,0) Else mciSendString("play " + DeviceName$,generic_bank,0,0) EndIf End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function pauses the specified mci device. ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciPause(DeviceName$) mciSendString("pause " + DeviceName$,generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function unpauses the specified mci device. ; (May not work with all devices?) ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciResume(DeviceName$) mciSendString("resume " + DeviceName$,generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function causes the specified mci device to seek to a position and stop. ; ; Position$ = ; "start" - Seek to the start of the media. ; "end" - Seek to the end of the media. ; "POSITION" - Seek to a specified position in the media, where POSITION is frames, milliseconds, or whatever the ; currently selected time format is. Ie: "635" ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciSeek(DeviceName$, Position$) mciSendString("seek " + DeviceName$ + " to " + Position$,generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function causes the specified mci digital-video device to step a specified number of frames forward or back. ; Frames can be a positive or negative value. ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciStep(DeviceName$, Frames) mciSendString("step " + DeviceName$ + " by " + Str$(Frames),generic_bank,0,0) End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function stops a device. ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciStop(DeviceName$) mciSendString("stop " + DeviceName$,generic_bank,0,0) End Function ; added by jfk Function mciClose(DeviceName$) mciSendString("close " + DeviceName$,generic_bank,0,0) End Function Function mciCapture(DeviceName$,savepath$) ; didn't work for some reason If savepath$<>"" mciSendString("capture " + DeviceName$+" as "+savepath$,generic_bank,4,0) EndIf End Function ; ------------------------------------------------------------------------------------------------------------------------------------- ; This function opens a configuration window for the specified mci device. ; ------------------------------------------------------------------------------------------------------------------------------------- Function mciConfigure(DeviceName$) mciSendString("configure " + DeviceName$,generic_bank,0,0) End Function |
Comments
| ||
Hey , this is cute, because I can finally jump at a specific frame in a video, but I found the problem with this in comparison to ddraw internal blitz commands (or even winmediaplayer) This probably uses old mediaplayer (4 I guess) libraries, which supports system installed codecs but doesnt support a lot of nice features like resampling of the image. Basically, If I stretch my PAL 4:3 (720x576 pixels) video onto a let's say 4:3 1024 x 768 resolution, the video became croppy, with big big pixels, and compression making shit. So basically, is not usable for a real videoplayer. This is a shame, as the super solid blitz commands allow openmovie, closemovie only :-/ Bye, |
Code Archives Forum