之前用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, int nNumberOfBands) = 0;
virtual int __stdcall GetEqualizerParam(int *pnPreAmpGain, int *pnBandGain, int nNumberOfBands) = 0;
virtual int __stdcall SetEqualizerPreampGain(int nGain) = 0;
virtual int __stdcall GetEqualizerPreampGain() = 0;
virtual int __stdcall SetEqualizerBandGain(int nBandIndex, int nGain) = 0;
virtual int __stdcall GetEqualizerBandGain(int nBandIndex) = 0;
virtual int __stdcall LoadID3(TID3Version nId3Version, TID3Info *pId3Info) = 0;
virtual int __stdcall LoadID3W(TID3Version nId3Version, TID3InfoW *pId3Info) = 0;
virtual int __stdcall LoadFileID3(const char *pchFileName, TStreamFormat nFormat, TID3Version nId3Version, TID3Info *pId3Info) = 0;
virtual int __stdcall LoadFileID3W(const wchar_t *pchFileName, TStreamFormat nFormat, TID3Version nId3Version, TID3InfoW *pId3Info) = 0;
virtual int __stdcall EnableEcho(int fEnable) = 0;
virtual int __stdcall SetEchoParam(TEchoEffect *pEchoEffect, int nNumberOfEffects) = 0;
virtual int __stdcall GetEchoParam(TEchoEffect *pEchoEffect, int nNumberOfEffects) = 0;
virtual int __stdcall SetCallbackFunc(TCallbackFunc pCallbackFunc,TCallbackMessage nMessages, void *user_data) = 0;
virtual int __stdcall SetRate(unsigned int nRate)= 0;
virtual unsigned int __stdcall GetRate()= 0;
virtual int __stdcall SetPitch(unsigned int nPitch)= 0;
virtual unsigned int __stdcall GetPitch()= 0;
virtual int __stdcall SetTempo(unsigned int nTempo)= 0;
virtual unsigned int __stdcall GetTempo()= 0;
virtual int __stdcall StereoCut(int fEnable, int fOutputCenter, int fBassToSides)= 0;
virtual void __stdcall Release() = 0;
virtual int __stdcall DetectBPM(TBMPDetectionMethod nMethod) = 0;
virtual int __stdcall DetectFileBPM(const char *pchFileName, TStreamFormat nFormat, TBMPDetectionMethod nMethod)= 0;
virtual int __stdcall DetectFileBPMW(const wchar_t *pchFileName, TStreamFormat nFormat, TBMPDetectionMethod nMethod)= 0;
virtual int __stdcall GetFFTData(int nFFTPoints, TFFTWindow nFFTWindow, int *pnHarmonicNumber,int *pnHarmonicFreq,int *pnLeftAmplitude,int *pnRightAmplitude,int *pnLeftPhase,int *pnRightPhase) = 0;
virtual int __stdcall DrawFFTGraphOnHDC(void* hdc, int nX, int nY, int nWidth, int nHeight) = 0;
virtual int __stdcall DrawFFTGraphOnHWND(void* hwnd, int nX, int nY, int nWidth, int nHeight) = 0;
virtual int __stdcall SetFFTGraphParam(TFFTGraphParamID nParamID, int nValue) = 0;
virtual int __stdcall GetFFTGraphParam(TFFTGraphParamID nParamID) = 0;// new inferface in ver. 2.0  - 23.04.2010.
virtual int __stdcall LoadID3Ex(TID3InfoEx *pId3Info, unsigned int fDecodeEmbededPicture) = 0;
virtual int __stdcall LoadID3ExW(TID3InfoExW *pId3Info, unsigned int fDecodeEmbededPicture) = 0;
virtual int __stdcall LoadFileID3Ex(const char *pchFileName, TStreamFormat nFormat, TID3InfoEx *pId3Info, unsigned int fDecodeEmbededPicture) = 0;
virtual int __stdcall LoadFileID3ExW(const wchar_t *pchFileName, TStreamFormat nFormat, TID3InfoExW *pId3Info, unsigned int fDecodeEmbededPicture) = 0;
virtual int __stdcall DrawBitmapToHDC(void *hdc, int X, int Y, int Width, int Height, void *hBitmap) = 0;
virtual int __stdcall DrawBitmapToHWND(void *hwnd, int X, int Y, int Width, int Height, void *hBitmap) = 0;
virtual int __stdcall EnumerateWaveIn() = 0;
virtual int __stdcall GetWaveInInfo(unsigned int nIndex, TWaveInInfo *pWaveInInfo) = 0;
virtual int __stdcall GetWaveInInfoW(unsigned int nIndex, TWaveInInfoW *pWaveInInfo) = 0;
virtual int __stdcall SetWaveInDevice(unsigned int nIndex) = 0;virtual int __stdcall SetWaveOutFile(const char *sFileName, TStreamFormat nFormat, unsigned int fOutputToSoundcard)= 0;
virtual int __stdcall SetWaveOutFileW(const wchar_t *sFileName, T

下面先上代码,注释写的比较清楚了,这次用到了base64类处理歌曲内置图片,把二进制流转化为base64字符串。

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, “wsock32.lib”)
#include <iostream>
#define port 8888 //监听端口
using namespace std;
#include "libzplay.h"
using namespace libZPlay;
class Base64
{
public:/*编码DataByte[in]输入的数据长度,以字节为单位*/string Encode(char* Data,int DataByte){//编码表const char EncodeTable[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//返回值string strEncode;unsigned char Tmp[4]={0};int LineLength=0;for(int i=0;i<(int)(DataByte / 3);i++){Tmp[1] = *Data++;Tmp[2] = *Data++;Tmp[3] = *Data++;strEncode+= EncodeTable[Tmp[1] >> 2];strEncode+= EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];strEncode+= EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];strEncode+= EncodeTable[Tmp[3] & 0x3F];if(LineLength+=4,LineLength==76) {strEncode+="\r\n";LineLength=0;}}//对剩余数据进行编码int Mod=DataByte % 3;if(Mod==1){Tmp[1] = *Data++;strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4)];strEncode+= "==";}else if(Mod==2){Tmp[1] = *Data++;Tmp[2] = *Data++;strEncode+= EncodeTable[(Tmp[1] & 0xFC) >> 2];strEncode+= EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];strEncode+= EncodeTable[((Tmp[2] & 0x0F) << 2)];strEncode+= "=";}return strEncode;}/*解码DataByte[in]输入的数据长度,以字节为单位OutByte[out]输出的数据长度,以字节为单位,请不要通过返回值计算输出数据的长度*/char* Decode(const char* Data,int DataByte,int& OutByte){//解码表const char DecodeTable[] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,62, // '+'0, 0, 0,63, // '/'52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'0, 0, 0, 0, 0, 0, 0,0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'0, 0, 0, 0, 0, 0,26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'};//返回值string strDecode;int nValue;int i= 0;while (i < DataByte){if (*Data != '\r' && *Data!='\n'){nValue = DecodeTable[*Data++] << 18;nValue += DecodeTable[*Data++] << 12;strDecode+=(nValue & 0x00FF0000) >> 16;OutByte++;if (*Data != '='){nValue += DecodeTable[*Data++] << 6;strDecode+=(nValue & 0x0000FF00) >> 8;OutByte++;if (*Data != '='){nValue += DecodeTable[*Data++];strDecode+=nValue & 0x000000FF;OutByte++;}}i += 4;}else// 回车换行,跳过{Data++;i++;}}return (char*)strDecode.data();}char* Utf8ToGb2312(const char* utf8){int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);wchar_t* wstr = new wchar_t[len+1];memset(wstr, 0, len+1);MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);char* str = new char[len+1];memset(str, 0, len+1);WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);if(wstr) delete[] wstr;return str;}
};
int main()
{WSAData wsa;if (::WSAStartup(MAKEWORD(2,2),&wsa) != 0){cout<<"WSAStartup error"<<endl;return 0;}//创建socket套接字SOCKET localFd = socket(AF_INET, SOCK_STREAM, 0);if (localFd == INVALID_SOCKET){cout << "socket 错误!" << endl;exit(-1);}//sockaddr_in结构体:可以存储一套网络地址(包括IP与端口)struct sockaddr_in localAddr;localAddr.sin_family = AF_INET;localAddr.sin_port = htons(port);  //绑定端口localAddr.sin_addr.s_addr = htonl(INADDR_ANY);//绑定本机IP地址//将网络地址与套接字绑定int res = bind(localFd, (struct sockaddr *)&localAddr, sizeof(localAddr));if (res == -1){cout << "绑定错误!" << endl;exit(-1);}//监听试图连接本机的客户端,监听的进程数这里设置为20listen(localFd, 20);cout << "服务运行中...." << endl;while (true)//接收客户端的请求{//创建sockaddr_in结构体,用来存储客户机的地址struct sockaddr_in clientAddr;int len = sizeof(clientAddr);//阻塞运行,直到收到某一客户机的连接请求,并返回客户机的描述符int clientFd = accept(localFd, (struct sockaddr *)&clientAddr, &len);if (clientFd == -1){cout << "accept错误\n"<< endl;exit(-1);}//客户端的信息char *ip = inet_ntoa(clientAddr.sin_addr);cout << "客户端: " << ip << " 连接到本服务器成功!" << endl;//输出客户端请求头char requestHead[1024] = {0};int size = recv(clientFd, requestHead, sizeof(requestHead),0);cout << "Request information:\n"<< requestHead << endl;cout << size << " bytes" << endl;char* getString=strtok(requestHead," ");getString=strtok(NULL," ");getString=strtok(getString,"");getString+=4;//截取/?q=Base64 base64;int getStringLength=0;getString=base64.Decode(getString,(int)strlen(getString),getStringLength);getString=base64.Utf8ToGb2312(getString);ZPlay* file = CreateZPlay();//创建类实例fileif(file == 0){printf("创建libzplay ID3类实例失败!\n");system("pause");return 0;}TID3InfoEx id3_info;if(file->LoadFileID3Ex(getString, sfAutodetect, &id3_info, 1)) //加载file的ID3v2标签信息{char* buffer=new char[id3_info.Picture.PictureDataSize];memcpy(buffer,id3_info.Picture.PictureData,id3_info.Picture.PictureDataSize);Base64 b64;string imgBase64=b64.Encode(buffer,id3_info.Picture.PictureDataSize);delete [] buffer;//向客户端发送响应头及string//char* html="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n<h1>欢迎使用sdxjwkq01的服务器</h1><hr>";string html="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n";html=html+"<p>标题 Title:"+id3_info.Title+"<p>";html=html+"<p>参与创作的艺术家 Artist:"+id3_info.Artist+"<p>";html=html+"<p>唱片集 Album:"+id3_info.Album+"<p>";html=html+"<p><img src='data:"+id3_info.Picture.MIMEType+";base64,"+imgBase64+"'></img></p>";send(clientFd, html.c_str(), html.length(),0);}else{char* html="HTTP/1.1 200 OK\r\nContent-type: text/html\r\n\r\n<h1>无法加载文件ID3标签信息</h1><hr>";send(clientFd, html, strlen(html),0);printf("无法加载文件ID3标签信息\n");}closesocket(clientFd);}
}

然后前端写个小demo去请求

<!doctype html>
<meta charset="gb2312">
<meta http-equiv="X-UA-Compatible" content="IE=9" >
<title>测试</title>
<hta:application
id=musicPlayer
scroll=no
innerborder=no
icon=app.ico
contextMenu=no
selection=yes
>
<iframe id="id3" src="" style="width:90%;height: 600px;scroll:yes;">
<head><meta charset="gb2312"></head>
</iframe>
<script>Base64:function Base64() {// private property_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";// public method for encodingthis.encode = function (input) {var output = "";var chr1, chr2, chr3, enc1, enc2, enc3, enc4;var i = 0;input = _utf8_encode(input);while (i < input.length) {chr1 = input.charCodeAt(i++);chr2 = input.charCodeAt(i++);chr3 = input.charCodeAt(i++);enc1 = chr1 >> 2;enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);enc4 = chr3 & 63;if (isNaN(chr2)) {enc3 = enc4 = 64;} else if (isNaN(chr3)) {enc4 = 64;}output = output +_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +_keyStr.charAt(enc3) + _keyStr.charAt(enc4);}return output;}// public method for decodingthis.decode = function (input) {var output = "";var chr1, chr2, chr3;var enc1, enc2, enc3, enc4;var i = 0;input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");while (i < input.length) {enc1 = _keyStr.indexOf(input.charAt(i++));enc2 = _keyStr.indexOf(input.charAt(i++));enc3 = _keyStr.indexOf(input.charAt(i++));enc4 = _keyStr.indexOf(input.charAt(i++));chr1 = (enc1 << 2) | (enc2 >> 4);chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);chr3 = ((enc3 & 3) << 6) | enc4;output = output + String.fromCharCode(chr1);if (enc3 != 64) {output = output + String.fromCharCode(chr2);}if (enc4 != 64) {output = output + String.fromCharCode(chr3);}}output = _utf8_decode(output);return output;}// private method for UTF-8 encoding_utf8_encode = function (string) {string = string.replace(/\r\n/g,"\n");var utftext = "";for (var n = 0; n < string.length; n++) {var c = string.charCodeAt(n);if (c < 128) {utftext += String.fromCharCode(c);} else if((c > 127) && (c < 2048)) {utftext += String.fromCharCode((c >> 6) | 192);utftext += String.fromCharCode((c & 63) | 128);} else {utftext += String.fromCharCode((c >> 12) | 224);utftext += String.fromCharCode(((c >> 6) & 63) | 128);utftext += String.fromCharCode((c & 63) | 128);}}return utftext;}// private method for UTF-8 decoding_utf8_decode = function (utftext) {var string = "";var i = 0;var c = c1 = c2 = 0;while ( i < utftext.length ) {c = utftext.charCodeAt(i);if (c < 128) {string += String.fromCharCode(c);i++;} else if((c > 191) && (c < 224)) {c2 = utftext.charCodeAt(i+1);string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));i += 2;} else {c2 = utftext.charCodeAt(i+1);c3 = utftext.charCodeAt(i+2);string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));i += 3;}}return string;}}this.onload=function(){var base64 = new this.Base64();document.getElementById("id3").src="http://localhost:8888/?q="+base64.encode("许巍  蓝莲花.mp3");}
</script>

效果如图,已经解析出相关图片和信息以网页形式发给前端。

其实如果做windows开发,这个库也支持将位图句柄显示到窗体中,virtual int __stdcall DrawBitmapToHWND(void *hwnd, int X, int Y, int Width, int Height, void *hBitmap) = 0;实例的这个方法就可以将位图显示在窗体控件上。

c++读取MP3文件专辑图片、歌手名等ID3v2信息相关推荐

  1. C语言读取mp3文件的信息

    MP3文件的ID3V1信息与ID3V2信息结构的分析 --吴俊涛2005/05/05 E-mail:bo_tao@126.com QQ:29248671 主 页:http://wjt276.home4 ...

  2. java读取mp3文件信息_用JAVA读取MP3文件的标签信息

    突然看到网上有人在用JavaScript来读取MP3中ID3信息.详细请看! 我也在网上搜索了用Flex写的实现同样的功能的.详细请看! 但是我比较熟悉Java.所以也在网上搜索到了用Java实现的读 ...

  3. 读取mp3文件音量_如何规范化或更改MP3文件的音量

    读取mp3文件音量 Have you ever been listening to MP3 music files that were really quiet while others were r ...

  4. 读取MP3文件的ID3v1信息

    前段时间,在局域网里面做一个小网站,其中有板块是涉及音乐的在线播放.考虑到以后维护的方便,决定把mp3文件都按专辑分不同的目录存放.然后使用一个程序监控存放mp3的目录,把每个mp3文件的信息都存入数 ...

  5. Py之Xlrd:Xlrd简介、安装、使用方法(读取xlsx文件的shee表头名/总行数/总列数、每一行的内容、指定列的内容)之详细攻略

    Py之Xlrd:Xlrd简介.安装.使用方法(读取xlsx文件的shee表头名/总行数/总列数.每一行的内容.指定列的内容)之详细攻略  导读      xlrd,xlwt和xlutils是用Pyth ...

  6. mp3 文件专辑封面 一点点知识

    mp3 文件专辑封面 一点点知识 (2013-04-22 22:40:09) 转载▼ 标签: android mp3 id3 封面 it 分类: Android机制 首先,MP3文件的专辑封面数据是编 ...

  7. java读取mp3文件

    JMF实际上是Java的一个类包.JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能.这些功能包括:媒体捕获.压缩.流转.回放,以及对各种主要媒体形式和编码的支 持,如M-J ...

  8. java中读取mp3文件_java读取mp3文件

    JMF实际上是Java的一个类包.JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能.这些功能包括:媒体捕获.压缩.流转.回放,以及对各种主要媒体形式和编码的支 持,如M-J ...

  9. python获取mp3音频数据_详解python进行mp3格式判断 python怎么读取mp3文件

    python中哪个库有em算法 EM算法初稿2016-4-28 初始化三个一维的高斯分布 from numpy import * import numpy as np import matplotli ...

最新文章

  1. 从校园情侣到教授夫妇,520当天他们携手发顶刊!
  2. OpenCV仿射变换Affine Transformations
  3. 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-手写数学公式输入...
  4. “睡服”面试官系列第二篇之promise(建议收藏学习)
  5. python变量命名可以有特殊符号吗,和孩子一起学习python之变量命名规则
  6. 中英文对照 —— 缩略词
  7. 软件发布!DOTA2统计学
  8. BZOJ4318: OSU!
  9. smokeping with tcpping centos 7 环境
  10. word如何批量居中图片
  11. 富文本编辑器ueditor 自定义工具栏配置
  12. 转载ios开发如何使用Xcode的Targets来管理开发和生产版本的构建
  13. 卢松松:寄生式创业更容易成功
  14. 2016--在技术的浪潮中自我实现
  15. uniapp公众号微信支付
  16. 百度android 定位返回161,重拾百度定位之踩坑篇(下)
  17. “安心工资条”荣获2017阿里钉钉创SaaS挑战赛总冠军
  18. Linux命令行二:远程复制命令 scp
  19. 抖音云控市场为什么这么火爆!
  20. python数据分析网上培训

热门文章

  1. 解决:syntax error at line xxx: `<<‘ unmatched
  2. 2022最新大厂Java面试集合,五面拿下阿里飞猪offer
  3. typora中插入LaTeX数学公式
  4. java cookbook 3_CookBook/Java核心/3-Java反射.md at master · Byron4j/CookBook · GitHub
  5. linux服务器503怎么解决,宝塔linux面板apache网站访问报错503 Service Unavailable怎么解决...
  6. PhantomJS将网页保存为图片
  7. truetype字体怎么转换成普通字体_TrueType字体该如何设置呢?
  8. SpringBoot 接口数据加解密技巧
  9. mysql在手游中的作用_手游业务MySQL数据库虚拟化漫谈 | By 肖力
  10. 泰戈编程答案第一期(每周日更新)