之前用javascript做了一个本地音乐播放器(javascript不依赖库开发windows应用程序_sdxjwkq01的博客-CSDN博客_js开发windows应用程序),最近想加个显示MP3内嵌图片和专辑信息的功能,一开始找了一个JavaScript的库,id3.js,可惜不支持IE9,只能选择用c++读取,先用c++实现一个http服务器,服务器负责解析MP3文件并返回歌ID3V2信息,JavaScript先用wscript.shell启动服务器,再通过get方法请求返回相应页面到iframe里,或者可以用ajax。
这次c++的实现用到了libzplay.dll这个库,功能非常强大,可以播放MP3,flac等众多音频,还可以提取相关专辑信息,相关功能它的头文件解释的很明白。
libzplay官方下载地址https://sourceforge.net/projects/libzplay/files/2.02/libzplay-2.02-sdk.7z/download,里面包含dll文件,a文件,lib文件等,还有相应的帮助文档。
下面是libzplay.h头文件里的一段,dll里定义的结构体这里面也可以看到它的结构
virtual int __stdcall SetSettings(TSettingID nSettingID, int nValue) = 0;
virtual int __stdcall GetSettings(TSettingID nSettingID) = 0;
virtual int __stdcall GetVersion() = 0;
virtual char * __stdcall GetError() = 0;
virtual wchar_t * __stdcall GetErrorW() = 0;
virtual TStreamFormat __stdcall GetFileFormat(const char *pchFileName) = 0;
virtual TStreamFormat __stdcall GetFileFormatW(const wchar_t *pchFileName) = 0;
virtual int __stdcall EnumerateWaveOut() = 0;
virtual int __stdcall GetWaveOutInfo(unsigned int nIndex, TWaveOutInfo *pWaveOutInfo) = 0;
virtual int __stdcall GetWaveOutInfoW(unsigned int nIndex, TWaveOutInfoW *pWaveOutInfo) = 0;
virtual int __stdcall SetWaveOutDevice(unsigned int nIndex) = 0;
virtual int __stdcall OpenFile(const char *sFileName, TStreamFormat nFormat)= 0;
virtual int __stdcall OpenFileW(const wchar_t *sFileName, TStreamFormat nFormat)= 0;
virtual int __stdcall AddFile(const char *sFileName, TStreamFormat nFormat)= 0;
virtual int __stdcall AddFileW(const wchar_t *sFileName, TStreamFormat nFormat)= 0;
virtual int __stdcall OpenStream(int fBuffered, int fDynamic, const void *sMemStream, unsigned int nStreamSize, TStreamFormat nFormat) = 0;
virtual int __stdcall PushDataToStream(const void *sMemNewData, unsigned int nNewDataize) = 0;
virtual int __stdcall IsStreamDataFree(const void *sMemNewData) = 0;
virtual void __stdcall GetDynamicStreamLoad(TStreamLoadInfo *pStreamLoadInfo) = 0;
virtual void __stdcall GetStreamInfo(TStreamInfo *pInfo) = 0;
virtual void __stdcall GetStreamInfoW(TStreamInfoW *pInfo) = 0;
virtual int __stdcall Close() = 0;
virtual int __stdcall Play() = 0;
virtual int __stdcall PlayLoop(TTimeFormat fFormatStartTime, TStreamTime *pStartTime, TTimeFormat fFormatEndTime, TStreamTime *pEndTime, unsigned int nNumOfCycles, unsigned int fContinuePlaying) = 0;
virtual int __stdcall Seek(TTimeFormat fFormat, TStreamTime *pTime, TSeekMethod nMoveMethod) = 0;
virtual int __stdcall ReverseMode(int fEnable) = 0;
virtual int __stdcall Stop() = 0;
virtual int __stdcall Pause() = 0;
virtual int __stdcall Resume() = 0;
virtual void __stdcall GetPosition(TStreamTime *pTime) = 0;
virtual int __stdcall SetMasterVolume(unsigned int nLeftVolume, unsigned int nRightVolume) = 0;
virtual int __stdcall SetPlayerVolume(unsigned int nLeftVolume, unsigned int nRightVolume) = 0;
virtual void __stdcall GetMasterVolume(unsigned int *pnLeftVolume, unsigned int *pnRightVolume) = 0;
virtual void __stdcall GetPlayerVolume(unsigned int *pnLeftVolume,unsigned int *pnRightVolume) = 0;
virtual int __stdcall GetBitrate(int fAverage) = 0;
virtual void __stdcall GetStatus(TStreamStatus *pStatus) = 0;
virtual int __stdcall MixChannels(int fEnable, unsigned int nLeftPercent, unsigned int nRightPercent) = 0;
virtual void __stdcall GetVUData(unsigned int *pnLeftChannel, unsigned int *pnRightChannel) = 0;
virtual int __stdcall SlideVolume(int fFormatStart, TStreamTime *pTimeStart, unsigned int nStartVolumeLeft, unsigned int nStartVolumeRight, int fFormatEnd, TStreamTime *pTimeEnd, unsigned int nEndVolumeLeft,unsigned int nEndVolumeRight) = 0;
virtual int __stdcall EnableEqualizer(int fEnable) = 0;
virtual int __stdcall SetEqualizerPoints(int *pnFreqPoint, int nNumOfPoints) = 0;
virtual int __stdcall GetEqualizerPoints(int *pnFreqPoint, int nFreqPointNumber) = 0;
virtual int __stdcall SetEqualizerParam(int nPreAmpGain, int *pnBandGain,