函数代码如下
void SoundPlay(LPCTSTR pszSound)
{
unsigned char* m_sndCrickets;
FILE *SndFile = fopen(pszSound, "r");
fseek(SndFile, 0, SEEK_END);
unsigned int uiFileSize = ftell(SndFile);
fseek(SndFile, 0, SEEK_SET);
m_sndCrickets = new unsigned char [uiFileSize];
fread(m_sndCrickets, uiFileSize, 1, SndFile);
fclose(SndFile);PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);//PlaySound(pszSound, NULL, SND_FILENAME | SND_ASYNC);}主要问题是:
PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);PlaySound(pszSound, NULL, SND_FILENAME | SND_ASYNC);
两种方法播放一个文件时,如果是使用内存播放那么就会在声音的结尾就会出现好像开关音箱的噪音
现在急需要从内存播放声音;或者你有其它方法在内存中播放声音又不会出理噪音也可以告诉我
void SoundPlay(LPCTSTR pszSound)
{
unsigned char* m_sndCrickets;
FILE *SndFile = fopen(pszSound, "r");
fseek(SndFile, 0, SEEK_END);
unsigned int uiFileSize = ftell(SndFile);
fseek(SndFile, 0, SEEK_SET);
m_sndCrickets = new unsigned char [uiFileSize];
fread(m_sndCrickets, uiFileSize, 1, SndFile);
fclose(SndFile);PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);//PlaySound(pszSound, NULL, SND_FILENAME | SND_ASYNC);}主要问题是:
PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);PlaySound(pszSound, NULL, SND_FILENAME | SND_ASYNC);
两种方法播放一个文件时,如果是使用内存播放那么就会在声音的结尾就会出现好像开关音箱的噪音
现在急需要从内存播放声音;或者你有其它方法在内存中播放声音又不会出理噪音也可以告诉我
1、首先在你的头文件中定义一个窗口句柄,来用保存音乐播放句柄:HWND m_hPlayWnd;
2、在CPP中添加如下代码:m_hPlayWnd = MCIWndCreate(this->GetSafeHwnd(), AfxGetInstanceHandle(), WS_CHILD | MCIWNDF_NOMENU, strMusicFileName);
if(m_hWnd == NULL)
return;
MCIWndPlay(m_hPlayWnd);
上述方法适合于播放一个文件,而我不是要播放一个文件,我要播放的内容不是以文件方式存在的,自己也想过最笨的方法:把内存中的播放内容存到tmp目录然后去播放文件。但这样十在即无效率又太笨,所以现在要找到一种能播放内存中数据的方法,而SND_MEMORY 可以播出声音但是多出一段噪声
MFC下还是CFile类要好用些
CFile file;
unsigned char* m_sndCrickets;
file.Open(pszSound, CFile::modeRead|CFile::typeBinary);
unsigned int uiFileSize = file.GetLength();
file.Seek(0,CFile::begin); m_sndCrickets = new unsigned char [uiFileSize];
int n=file.Read(m_sndCrickets, uiFileSize);
PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);
file.Close();
,我用两种方法都根了一下:如果用
FILE读,当读到86016 以后就全不对了,这个位置正好是84K的位置,难到
fread(m_sndCrickets, uiFileSize, 1, SndFile);
参数二不能大于84K吗?值得再去查查,
把
FILE *SndFile = fopen(pszSound, "r");
改成
FILE *SndFile = fopen(pszSound, "rb");
即可,原因是因为没有用二制制打开文件,所以seek起来有问题
准备结帖,
分不太多大家别嫌弃,
再次感谢大家,特别是bottlebox帮我找到的原因所在