无外部控件制作多媒体播放器.docx
- 文档编号:14369261
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:19
- 大小:38.32KB
无外部控件制作多媒体播放器.docx
《无外部控件制作多媒体播放器.docx》由会员分享,可在线阅读,更多相关《无外部控件制作多媒体播放器.docx(19页珍藏版)》请在冰点文库上搜索。
无外部控件制作多媒体播放器
无外部控件制作多媒体播放器
无外部控件制作多媒体播放器
利用MCI指令制作播放器,简单实用,很适合于做为自己软件的一个附带功能或背景音乐,正是基于这点需求,我准备分几个部分来写:
1、MCI指令的简单使用;
2、媒体播放的进度控制与音量调节;
3、音乐信息的读取,包括MP3(ID3V1&ID3V2)与ASF(WMA&WMV)等;
4、音乐列表的建立与保存(M3U格式)
本来主要是想写播放音乐的,举个播放视频的例子,没什么别的意思,只是感觉播放音乐实在是简单,没什么可写,同时也是为了说明,MCI放视频也是可以的。
PrivateConstWS_CHILD=&H40000000
PrivateDeclareFunctionmciSendStringLib"winmm.dll"Alias"mciSendStringA"(ByVallpstrCommandAsString,ByVallpstrReturnStringAsString,ByValuReturnLengthAsLong,ByValhwndCallbackAsLong)AsLong
PrivateDeclareFunctionGetShortPathNameLib"kernel32"Alias"GetShortPathNameA"(ByVallpszLongPathAsString,ByVallpszShortPathAsString,ByValcchBufferAsLong)AsLong
PrivateDeclareFunctionSetWindowPosLib"user32"(ByValhWndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLong
PrivateFunctionShortName(LNameAsString)AsString
'取得短文件名
DimsAsString,iAsLong
i=512
s=Space$(i)
GetShortPathNameLName,s,i
ShortName=Left$(s,InStr(1,s,vbNullChar)-1)
EndFunction
PrivateFunctionPlayMCI(CmdAsString,OptionalReturnStrAsString)AsLong
'播放MCI
DimsAsString
s=Space$(256)
PlayMCI=mciSendString(Cmd,s,256,0)
ReturnStr=Left$(s,InStr(1,s,vbNullChar)-1)
EndFunction
PrivateFunctionShowVideo(strFileNameAsString,hwdAsLong,xAsLong,yAsLong,wAsLong,hAsLong)AsLong
DimiAsLong,sAsString
IfDir(strFileName,vbHiddenOrvbReadOnlyOrvbSystem)=vbNullStringOrstrFileName=vbNullStringThenExitFunction
i=PlayMCI("open"""&ShortName(strFileName)&"""aliasSongparent"&hwd&"style"&WS_CHILD&"WAIT")
Ifi<>0ThenExitFunction
i=PlayMCI("STATUSSongWINDOWHANDLEWAIT",s)
Ifi<>0ThenGoTofail
i=Val(s)
Ifi=0ThenGoTofail
SetWindowPosi,0,x,y,w,h,0
PlayMCI"playSong"
ShowVideo=i '若成功返回视频窗口的句柄
ExitFunction
fail:
PlayMCI"closeSong"
EndFunction
PrivateSubcmdPlay_Click()
i=ShowVideo("h:
\1.wmv",Me.hWnd,0,0,100,100)
'返回的这个句柄,很有用的,可用于移动窗口位置,或SubClass它,加上弹出菜单,响应鼠标动作等
If i<>0Then
cmdPlay.Enabled=False
cmdStop.Enabled=True
EndIf
EndSub
PrivateSubcmdStop_Click()
PlayMCI"closeSong"
cmdPlay.Enabled=True
cmdStop.Enabled=False
EndSub
PrivateSubForm_Load()
Me.ScaleMode=3
cmdPlay.Enabled=True
cmdStop.Enabled=False
cmdPlay.Caption="播放"
cmdStop.Caption="停止"
EndSub
PrivateSubForm_Unload(CancelAsInteger)
PlayMCI"closeSong"
EndSub
本来想写点进度控制与音量调整的代码的,后来发现还是太简单了,就是几个MCI命令,来回搬弄,自己都没兴趣写下去。
所以我想还是写些独门一点的:
音乐信息的读取!
目前常见的主流音乐格式就两种,MP3与WMA,它们都有在文件中保存音乐信息的特定格式,MP3使用的当然是家喻户晓的ID3格式,分为V1与V2两个版本;WMA是MS的宠儿,它只是ASF格式的一个分支,当然遵循ASF的包装规则。
怎么获取它们包含的音乐信息呢?
一般是自己读取,当然XP系统开始提供了音乐文件的详细信息资料,利用FSO可以真接从系统那里读取到,这不在本文范围,毕竟不用控件更自由,通用性更好。
所以,有必要去深入一下这几种音乐信息格式。
还是用代码说话吧,先说说MP3的ID3V1与ID3V2的格式。
ID3V1很简单,共128个字节,写在文件尾部,格式如下:
PrivateTypeMp3ID3V1
HeaderAsString*3
TitleAsString*30
ArtistAsString*30
AlbumAsString*30
YearAsString*4
CommentAsString*30
GenreAsString*1
EndType
ID3V2是后来出现的,可扩展性很强,写在文件头部,采用标签组格式,分两部分,一是标签组的总头部,一是每个子标签的头部,分别定义如下:
PrivateTypeMp3ID3V2
HeaderAsString*3
VerAsByte
RevisionAsByte
FlagAsByte
Size(3)AsByte
EndType
PrivateTypeMp3ID3V2Tag
TagAsString*4
Size(3)AsByte
Flag
(1)AsByte
EndType
为了组织音乐信息的方便,我还定义了一个自己的结构,以便于使用:
'音乐类型
PrivateEnumMediaType
mciMIDI=1
mciMP3=2
mciASF=4
mciVIDEO=8
mciWAVE=16
EndEnum
'装载音乐信息的结构
PrivateTypeMusicInfo
FileNameAsString
MusicTypeAsMediaType
TitleAsString
ArtistAsString
AlbumAsString
YearAsString
LyricsAsString
WriterAsString
ComposerAsString
BitsAsString
SampleAsString
LengthAsLong
EndType
'我习惯于用代码说明问题,所以还是看看代码吧
PrivateFunctionGetMusicInfo(udtInfoAsMusicInfo)AsBoolean
DimstrFileNameAsString,a()AsString,iAsLong
WithudtInfo
strFileName=Dir(.FileName,vbNormalOrvbHiddenOrvbReadOnlyOrvbSystemOrvbArchive)
IfstrFileName=vbNullStringThenExitFunction
.MusicType=GetMCIType(strFileName)
If.MusicTypeAndmciMP3Then
GetMusicInfo=GetMP3Info(udtInfo)
ElseIf.MusicTypeAndmciASFThen
GetMusicInfo=GetASFInfo(udtInfo)
EndIf
EndWith
EndFunction
PrivateFunctionGetMCIType(strFileNameAsString)AsMediaType
DimextAsString
IfstrFileName<>vbNullStringThen
ext=LCase$(Mid$(strFileName,InStrRev(strFileName,".")))
SelectCaseext
Case".mpg",".mpeg",".avi",".mpe",".mpa",".m1v",".ifo",".vob"
GetMCIType=mciVIDEO
Case".mp3"
GetMCIType=mciMP3
Case".wav",".snd",".aif",".au",".aifc",".aiff"
GetMCIType=mciWAVE
Case".asf",".wma",".wm",".wmd"
GetMCIType=mciASF
Case".wmv"
GetMCIType=mciASFOrmciVIDEO
Case".mid",".midi",".rmi"
GetMCIType=mciMIDI
EndSelect
EndIf
EndFunction
PrivateFunctionGetMP3Info(udtInfoAsMusicInfo)AsBoolean
DimFreeNoAsLong,n
(1)AsByte,b()AsByte,TmpInfoAsMusicInfo
DimPowerAsLong,vAsLong,jAsLong,TaghAsMp3ID3V2Tag
Dimid3AsMp3ID3V1,sAsString,PosAsLong,id32AsMp3ID3V2
DimszAsLong,s1AsString
TmpInfo=udtInfo
OnErrorGoToexitg
FreeNo=FreeFile
OpenTmpInfo.FileNameForBinaryAs#FreeNo
WithTmpInfo
Pos=LOF(FreeNo)-127
IfPos>0Then
Get#FreeNo,Pos,id3
IfUCase$(id3.Header)="TAG"Then
s=Trim$(Replace$(id3.Title,vbNullChar,vbNullString))
IfLen(s)>0Then
s=Replace$(s,"-",vbNullString)
s=Replace$(s,"——",vbNullString)
s=Replace$(s,".mp3",vbNullString,,,vbTextCompare)
.Title=s
EndIf
s=Trim$(Replace$(id3.Artist,vbNullChar,vbNullString))
IfLen(s)>0Then
Case"TCOM"
.Composer=s
Case"TEXT"
.Writer=s
Case"TYER"
.Year=s
Case"USLT"
s=Replace$(s," ","")
IfLCase$(Left$(s,3))="chi"Then
.Lyrics=Mid$(s,4)
ElseIfLCase$(Left$(s,3))="eng"Then
.Lyrics=Mid$(s,4)
Else
.Lyrics=s
EndIf
EndSelect
EndIf
Get#FreeNo,,Tagh
Loop
Else
Pos=1
EndIf
Get#FreeNo,Pos,n
sz=Pos
IfNot(n(0)=&HFFAndn
(1)>=&HFAAndn
(1)<=&HFF)Then
DoWhileNot(n(0)=&HFFAndn
(1)=&HFB)
Pos=Pos+1
IfSeek(FreeNo)-sz>8192ThenGoToexitg
Get#FreeNo,Pos,n
Loop
EndIf
Get#FreeNo,,n
v=0
Forj=4To7
Power=2^j
If(n(0)AndPower)=PowerThenv=v+Power
Next
v=v\16
.Bits=Trim$(Mid$("14432032 48 56 64 80 96 112128160192224256320",v*4+1,4))&"Kbps"
v=0
Forj=2To3
Power=2^j
If(n(0)AndPower)=PowerThenv=v+Power
Next
v=v\4
.Sample=Trim$(Mid$("444832?
?
",v*3+1,3))&"KHz"
EndWith
udtInfo=TmpInfo
GetMP3Info=True
exitg:
Close#FreeNo
EndFunction
ASF全名为高级系统格式,是MS大力推宠的一种媒体格式,并已得到广泛支持。
其最主要的分支就是用于音频的WMA与视频的WMV,当然还有ASF自身。
在下面地址可下载到ASF格式的说明文档:
ASF格式由一个个不同功能的ASF对象组成,每个对象都有一个GUID做标识,你只需识别对象后,按对象格式读结构,就能找到你要的信息。
媒体信息内容都在ASF头部对象ASF_Header_Object中,头部对象又包含若干子对象,其中与媒体信息有关的对象也就三个:
ASF_Codec_List_Object、ASF_Content_Description_Object、ASF_Extended_Content_Description_Object,本文也就是针对这三个对象的读写。
'ASF格式的几个与音乐信息相关的对象
PrivateConstASF_Header_Object="{75B22630-668E-11CF-A6D9-00AA0062CE6C}"
PrivateConstASF_Codec_List_Object="{86D15240-311D-11D0-A3A4-00A0C90348F6}"
PrivateConstASF_Content_Description_Object="{75B22633-668E-11CF-A6D9-00AA0062CE6C}"
PrivateConstASF_Extended_Content_Description_Object="{D2D0A440-E307-11D2-97F0-00A0C95EA850}"
'GUID对象标识
PrivateTypeGUID
dwData1AsLong
wData2AsInteger
wData3AsInteger
abData4(7)AsByte
EndType
'音乐类型,我自己定义的,不是标准哟
PrivateEnumMediaType
mciMIDI=1
mciMP3=2
mciASF=4
mciVIDEO=8
mciWAVE=16
EndEnum
'装载音乐信息的结构
PrivateTypeMusicInfo
FileNameAsString
MusicTypeAsMediaType
TitleAsString
ArtistAsString
AlbumAsString
YearAsString
LyricsAsString
WriterAsString
ComposerAsString
BitsAsString
SampleAsString
LengthAsLong
EndType
'ASF对象标识结构
PrivateTypeObjHeader
IDAsGUID
Size
(1)AsLong
EndType
'ASF文件头对象结构
PrivateTypeASFHeader
HeaderInfoAsObjHeader
NumOfHeaderAsLong
Reserved1AsByte
Reserved2AsByte
EndType
'ASF内容描述结构
PrivateTypeContentDescription
TitleLengthAsInteger
AuthorLengthAsInteger
CopyrightLengthAs
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 外部 控件 制作 多媒体 播放