出现了个新问题,我用mciSendString("seek MyPlay to xx",vbNullString,0,0)不能达到定位播放当前乐曲的效果,出现的效果竟然是,当前ListBox里有几首歌,XX就是播放第几首歌的效果,如果XX比当前歌曲多,就停止播放?到底如何定位当前MP3的播放位置呢?例如从一半开始播放......谢谢指点!
Case MM_MCINOTIFY ' MCI If (wParam = MCI_NOTIFY_SUCCESSFUL) Then MsgBox "播放完毕" Exit Function End If 用hook 技术 好像可以
can stretch input:如果设备能在数据流解压到帧缓冲的同时能缩放输出的图像则返回TRUEcan test:如果设备能识别“test“关键字则返回TRUEcav:当与其它项组合使用时,该参数返回申请CAV格式时,videodiscs设备的返回信息,如果没有插入任何videodiscs该参数为默认值clock increment rate:返回外部时钟将每秒钟分为几个单位,如millisecond返回1000,0表示没有支持的外部时钟clv:当与其它项组合使用时,该参数返回申请CLV格式时,videodiscs设备的返回信息compound device:设备支持文件名时返回TRUEdevice type:返回设备类型名,其值可以如下: cdaudio dat digitalvideo other overlay scanner sequencer vcr videodisc waveaudiofast play rate:返回每秒快放的帧数,如果为0则不支持快放has audio:如果设备支持音频则返回TRUEhas clock:如果设备支持时钟则返回TRUEhas still:如果设备将文件视为一静态图像比动态视频文件更快则返回TRUEhas timecode:如果设备支持timecode则返回TRUEhas video:如果设备支持视频则返回TRUEinputs:返回输入设备的总数maximum play rate:返回最快的播放速度,单位为帧每秒minimum play rate:返回最慢的播放速度,单位为帧每秒normal play rate:返回正常的播放速度,单位为帧每秒 number of s:返回最大的遮罩数量,0表示不支持遮罩ouputs:返回输出设备的总数seek accuracy:返回定位某帧的精确度,0表示精确定位,1表示与所要定位的帧的误差不大于1帧slow play rate:返回慢放的播放速度,单位为帧每秒uses files:如果复合设备使用的数据保存在文件中则返回真uses palettes:如果设备使用调色板则返回真windows:返回设备支持的可以同时显示的窗口数量Capture:将帧缓冲的数据拷贝到指定的文件中。digital-video支持该命令。 at pathname:指定所捕捉的帧缓冲中的图像所要保存的路径和文件名 at rectangle:指定所捕捉的帧缓冲中的图像区域,默认为put命令的source参数指定的区域 注意:该命令可能会在播放的时候或者在需要资源的操作中失效。如果帧缓冲在实时地更新,则会暂停。Close:关闭设备,释放内存。当一个MCI设备的所有实例或文件都关闭的时候,该MCI设备被卸载。所有设备支持该命令。 注意:如果要关闭所有的设备需如此:close allConfigure:显示一对话框,以设置设备的某些属性。digital-video支持该命令。Copy:将数据拷贝至剪切板。digital-video支持该命令。at rectangle:指定要拷贝的帧缓冲的区域,默认为整个帧缓冲audio stream stream:指定该命令影响的当前工作组的音频流,如果使用了该参数,又想拷贝视频流,则必须指定“video stream“参数,默认为audio stream+video streamfrom position:指定开始记录点,默认为当前位置to position:指定终点,该位置的视音频流不被记录,默认为当前工作组的终点video stream stream:指定该命令影响的工作组中的视频流,如果使用了该参数,又想拷贝音频流,则必须指定“audio stream“参数Cue:在播放或记录之前执行该命令可以加快播放或记录速度。digital-video,VCR和waveform-audio支持该命令。from position:指定起始点
input:准备记录。digital-video可以省略noshow:准备播放,但不先显示。output:准备播放,如果input和output都没指定,默认为outputpreroll:预滚动到下一位置reverse:指定为倒放to position:指定终点注意:如果设备正在播放、记录或暂停则该命令会失败。使用了“output”参数时,再使用“play”命令的“from”、“to”或“reverse”参数则会退出该命令,使用了“input”参数时,再使用“record”命令的“from”、“to”或“initialize”参数会退出该命令。Cut:将工作区的数据剪切到剪切板。digital-video支持该命令。 at rectangle:指定每一帧的区域。默认为整个帧。当该参数被指定时,帧并不被删除,代替原图像信息的为黑色块 audio stream stream:指定该命令影响的当前工作组的指定音频流,如果使用了该参数,又想剪切视频流,则必须指定“video stream“参数,默认为audio stream+video stream from position:指定开始剪切点,默认为当前位置 to position:指定终点,终点并不被剪切,默认为工作组终点 video stream stream:指定该命令影响的当前工作组的指定视频流,如果使用了该参数,又想剪切音频流,则必须指定“video stream“参数,默认为audio stream+video stream 注意:在没有调用“save”命令前,虽然播放的时候好像“cut”命令已经成功了,但只有当“save”命令被调用后该命令所作的删除才会被写入文件Delete:从已打开的多媒体文件中删除数据段。digital-video和waveform-audio支持该命令。 at rectangle:指定每帧删除的区域。默认为整个帧。当该参数被指定时,帧并不被删除,代替原图像信息的为黑色块 audio stream stream:指定该命令影响的当前工作组的音频流。如果使用了该参数,又想删除视频流,则必须指定“video stream“参数,默认为audio stream+video stream from position:指定开始位置,默认为当前位置 to position:指定终点,默认为工作组终点 video stream stream:指定该命令影响的当前工作组的视频流,如果使用了该参数,又想删除音频流,则必须指定“video stream“参数,默认为audio stream+video stream 注意:在执行任何使用position参数的命令前,你可以使用“set”命令的“time format”参数来设定媒体的时间格式,如毫秒,帧等Escape:将设备指定的信息传送到某设备。videodisc设备支持该命令。Freeze:终止视频输入或输出,禁止视频流从帧缓冲中获得数据。dgital-video、video-overlay和VCR支持该命令。 at rectangle:指定区域。对于digital-video设备,在指定区域中的像素会遮罩覆盖。rectangle的格式为X1 Y1 X2 Y2。X1 Y1为左上角坐标,X2 Y2指定宽度和长度 field:冻结指定的区域,该参数为默认的 frame:冻结整个帧 input:冻结输入图像的当前帧,不管当前正在播放还是暂停 output:冻结VCR的当前帧输出。如果VCR在播放的时候执行该命令,则当前帧被冻结且VCR被暂停。如果VCE已暂停则当前帧被冻结。如果input和output都没指定,则默认为output outside:指定被冻结的为“at”参数所定义的区域外面部分 注意:要指定一个不规则区域,可以组合使用freeze和unfreeze命令。一些video-overlay设备会限制区域的复杂度index:控制VCR设备实屏显示。仅VCR设备支持 off:关闭实屏显示 on:打开实屏显示。显示的项目为“set”命令的“index”参数指定的信息Info:获得设备信息,例如算法,版权,所打开的文件,UPC等等。所有MCI设备都支持该命令。 audio algorithm:返回当前音频压缩算法的名称 audio quality;返回当前音频压缩质量的描述。如果将其quality设为某一值而未使用其指定值可能会返回unknown copyright:返回MIDI文件的版权信息 file:返回复合设备使用的文件名。如果设备没有打开一个文件而且“load”命令也没被用过,那么返回一个空字符串 info identity:为CD产生一个唯一的序列号 info upc:产生CD的UPC(Universal product Code全球产品码) input:返回当前输入设备的描述 name:返回sequence名字 output:返回当前输出设备的描述 product:返回该设备的描述。返回信息经常包括产品名称和型号。返回信息经常是31个字节或更小 still algorithm:返回当前静态图像压缩算法名称 still quality:返回当前静态图像压缩质量描述名。如果将其quality设为某一值而未使用其指定值可能会返回unknown usage:返回工作组中视音频数据的使用限制描述 version:返回设备驱动或硬件的版本
video algorithm:返回当前视频压缩算法名称 video quality:返回当前视频压缩质量描述名如果将其quality设为某一值而未使用其指定值可能会返回unknown window text:返回设备使用的窗口的标题List:返回视频和音频的数量和类型。digital-video和VCR支持该命令。 audio algorithm:返回音频压缩算法名称 audio quality algorithm algorithm:返回“algorithm”指定的压缩质量级别。如果“algorithm”为“current,”则返回当前压缩算法的质量级别 audio source count:返回音频输入的总数 audio source number index:返回“index”指定的音频输入源的类型 audio stream:返回当前工作组中的音频流名称,例如English或German count:返回指定类型的数量(供“number index”使用) number index:返回一描述由index指定的类型的字符串。index必须在1至count返回的数值之间 still algorithm:返回静态图像压缩算法名称 still quality algorithm algorithm:返回由algorithm指定的静态图像的压缩质量级别。如果“algorithm”为“current”,则返回当前压缩算法的质量级别 video algorithm:返回视频压缩算法名称 video quality algorithm algorithm:返回由algorithm指定的视频压缩质量级别。如果“algorithm”为“current”,则返回当前压缩算法的质量级别 video source:返回视频源信息。当使用“count”参数时,返回的是视频源数量。当使用“number”参数时,返回的是某一视频源的类型。MCI定义了以下的类型常量:“ntsc”,“rgb”,“pal”,“secam”,“svideo”,“generic”。同一类型可能会返回多个源。当某一频道允许使用多个信号时,则会使用“generic”数据源 video source count:返回视频输入的总数 video source number index:返回“index”指定的视频输入源类型 video stream:返回当前工作组视频流名称,例如“funny ending”或“sad ending” 注意:对于VCR设备,“video source”和“audio source”必须与“count”或“number”参数同时使用。如果为“count”,则返回输入的视频或音频流的总数。如果为“number”,则返回相应的输入设备类型。它可以为以下值:“tuner”,“line”,“svideo”,“aux”,“generic”。一般来说,应该先用“count”参数查询一下VCR设备,再指定“number”参数Load:用设备指定的格式打开一个文件。类似于open的功能。digital-video和video-overlay支持该命令。Mark:控制记录或删除磁带上的遮罩,VCR设备支持该命令。 erase:如果当前位置存在遮罩,则擦除它 write:写入遮罩,VCR设备必须在播放或者记录中 遮罩是可以被VCR设备在高速查找中检测到的写入到记录体中的特殊信号。遮罩是VCR的特点。Monitor:指定当前数据源,默认的当前数据源是当前工作区。转换当前源会转换所有的当前源中的音视频流。digital-video设备支持该命令。 file:指定当前工作组为当前数据源input:指定外部输入为当前数据源。如果正在播放,则先暂停。如果“setvideo”命令“on”参数已设,则本参数会显示一个默认的隐藏窗口。当指定一个输入的数据源时,设备的其它实例的功能可能会受到限制 method method:当和“input”参数一起使用时,“method”值可以为“pre”,“post”或“direct”。Open: alias device_alias:指定设备的别名。一但指定该参数,则后续命令的“device_id”必须为变量“device_alias” buffer buffer_size:设定waveform-audio设备的缓冲区大小,单位为秒。典型的设置为4秒,MCIWAVE设备最小为2秒,最大为9秒 parent hwnd:指定父窗体句柄 shareable:初始化设备时将其设为共享。如果某设备已设为共享方式打开,而又想再次打开该设备,则必须再指定该参数。MCISEQ sequencer及MCIWAVE设备不支持文具参数 sytle child:以子窗体方式打开一个窗体 style overlapped:以重叠方式打开一个窗体 style popup:以弹出式打开一个窗体 style style_type:指定一窗体样式 type device_type:指定某文件的设备类型 注意:如果使用“capability”命令为打开的设备返回设备类型,对于CD audio设备返回“cdaudio”,videodisc返回“videodisc”,MIDI sequencer返回“sequencer”,digital-video返回“AVIVideo”,waveform-audio返回“waveaudio”。Paste:将剪切板的内容拷贝至工作区。digital-video设备支持该命令。 at rectangle:指定帧数据粘贴的区域。包括边界 audio stream stream:该命令影响工作区中指定的音频流。如果指定该参数后又想粘贴视频流,则必须指定“video stream”参数。默认为audio stream+video stream insert:指定数据将被插入到工作区。插入点的数据会被移动到前面。这是默认设定 overwrite:将数据拷贝到工作区,插入点后的数据会被覆盖 to position:指定数据粘贴的工作区位置。默认为当前位置 video stream stream:该命令影响工作区中指定的视频流。如果指定该参数后又想粘贴音频流,则必须指定“audio stream”参数。默认为audio stream+video streamPause:暂停播放或记录。CD audio,digital-video,MIDI sequencer,VCR,videodisc和waveform-audio支持该命令。Play:呵呵,这个命令无须多说。CD audio,digital-video,MIDI sequencer,videodisc,VCR和waveform-audio支持该设备。 at time:指定设备执行该命令的时间。
If Left(s, 7) = "stopped" Or Left(s, 2) = "停止" Then
msgbox "停止了,播放下一首吧!!"
end if
该语句的功能:
向MCI设备查询当前状态,把结果保存在字符串 s 中,通过分析s中的内容,就可获得MCI设备的许多状态。
Dim cmtmp As String '命令临时变量
cmtmp = "seek" & Space(1) & "mp3" & Space(1) & "to" & Space(1) & lnglength '查找到指定得位置lnglength为你想要到的地方大于0小于等于mp3的长度
mciSendString cmtmp, vbNull, 0, 0'跳到你指定的长度
例如上面mp3的长度lnglength,是如何得到的?
这个是自己定义的,它取值范围是大于0小于等于mp3的长度
获得mp3媒体的长度是mciSendString "status mp3 length", mp3time, Len(mp3time), 0
mp3time是自己定义的long型的,那个lnglength也是long的
还有,怎么获得BitRate呢?
难道要用一个timer 一直判断
mciSendString "status mp3 position", getpos, Len(getpos), 0'是否满足吗?
mciSendString "play MyPlay", 0, 0, 0lngCurPos 是一个Long型值
正确的长度我是指:
当MP3的BitRate不是标准的112、128、256、320等可以获得正确的长度,而是如:225、142等不标准的BitRate时,获得的长度要远大于MP3的实际长度
长度是指总的帧数,换算成时间后如:3:23之类。
找了很多资料,都没有提及如何用MCI获取BitRate的,长度方面也都是大同小异。
MCI Command String总览—完全参数篇 (注:本文以2000年七月的MSDN解释为准) (由于小弟在MCI指令方面的认识有限,本文误解、疏漏甚至错误之处在所难免,请朋友们不吝指正。小弟的信箱是[email protected]) MCI Command String是多媒体设备的程序接口。通过它,我们可以打开一个多媒体文件,例如mp3,VCD,Mpeg4格式的文件等等,并对它进行播放,暂停,关闭等操作。现在小弟有幸给大家介绍一下MCI Command String的使用方法。MCI Command String是通过mciExecute或mciSendString两个函数执行的。这两个函数的声明如下:Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExecute" (ByVal lpstrCommand As String) As LongPrivate Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long这两个函数都有一个叫lpstrCommand的参数, 这个参数就是我们今天要介绍的MCI Command String。其中函数mciSendString还有三个参数,lpstrReturnString是一个字符串,它用来接收mciSendString函数返回的信息(例如,我们在lpstrCommand中的命令是让函数返回打开的文件的设备类型,那么函数就把设备类型的信息保存在lpstrReturnString参数中。);uReturnLength参数用来指定参数lpstrReturnString的长度;hwndCallback是接收“wait”、“notify”消息的窗口句柄,在Visual Basic中调用时该参数设为0即可。如果命令执行出错,函数mciExecute会直接弹出一个对话框,提示出错的原因。而mciSendString函数会返回一个ErrorCode (错误代码),该代码的具体含义您可以参考MSDN中的目录“Platform SDK\Graphics and Multimedia Services\Windows Multimedia\Multimedia Reference\Multimedia Constants\MCIERR Return Values”。您可以根据具体情况选择到底使用哪一个函数来执行MCI命令。例如,在调试的时候使用mciExecute,以便快速地获得错误原因,而在将要发布的程序中使用mciSendString函数,让程序中已设置的错误陷阱去处理错误,以避免频繁的错误提示而使用户觉得厌烦。(对于有返回值的MCI命令,必须使用mciSendString函数。) 在熟悉了这两个函数后,我们就可以进入正题――MCI Command String了。MCI Command String的命令格式是这样的:lpszCommand lpszDevice lpszCommandFlag lpazFlaglpszCommand是mci命令,例如open,play,stop,close等等。lpszDevice是设备名(或文件名)。例如,我们用以下的程序打开了我的文档中的Music01.dat文件,并用“alias”参数将其别名设为OpenFile:dim lReturn as long (1)lReturn=mciExecute(“open C:\Mydocu~1\Music01.dat alias OpenFile type MPEGVideo”) (2)那么,在以后的MCI Command String中lpszDevice参数必须指定为OpenFile。例如,关闭该文件的代码如下:lReturn=mciExecute(“close OpenFile”) (3)如果我们没有为打开的文件设定别名,则以后调用的MCI Command String中lpszDevice参数为DOS路径名加文件名。例子如下:dim lReturn as long (4)lReturn=mciExecute(“open C:\Mydocu~1\Music01.dat type MPEGVideo”) (5)lReturn=mciExecute(“close C:\Mydocu~1\Music01.dat type MPEGVideo”) (6)从这里可以看出,设定别名的好处是减少了代码的输入。LpszCommandFlag是mci命令的参数。如上代码(2),“alias OpenFile”以及“type MPEGVideo”就是命令“open”的参数。通常一个mci命令的参数少则几个多则几十个。LpazFlag可以为指定为“wait”或“notity”。如果为“wait”,那么mci命令执行完毕后会向父窗体发送MCI_WAIT消息,“notity”则发送MCI_NOTIFY消息。此参数在Visual Basic中无甚用处。
只要它等于"stopped",就是当前乐曲播放完毕,就进行下一首,请问你取得位数信息后用来实现什么功能?
看看吧
If (wParam = MCI_NOTIFY_SUCCESSFUL) Then
MsgBox "播放完毕"
Exit Function
End If
用hook 技术 好像可以