C++ 中的 Playsound:.wav 文件的文件错误
Posted
技术标签:
【中文标题】C++ 中的 Playsound:.wav 文件的文件错误【英文标题】:Playsound in C++: File error with .wav file 【发布时间】:2016-08-22 12:58:49 【问题描述】:我正在复制粘贴,然后修改 PlaySound 的各种示例,以便弄清楚如何在 C++ 程序中播放 .wav 文件。
现在我有一个似乎比其他任何一个都更有效,但是当文件执行时它不会播放 .wav 文件,并且在窗口内它告诉我 .wav 文件存在文件错误.
重申:程序构建和运行没有问题。错误出现在正在运行的程序中。我不太清楚问题是什么。会不会只是位置问题?
错误提示:“Wave::file error: drake.wav”
我已经设置了 SDL,但我可能做错了。我使用了Lazyfoo 上的指南。我正在使用 Codeblocks 和 MinGW。
这是我找到的代码here:
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
class Wave
public:
Wave(char * filename);
~Wave();
void play(bool async=true);
bool isok();
private:
char * buffer;
bool ok;
HINSTANCE HInstance;
;
Wave::Wave(char * filename)
ok = false;
buffer = 0;
HInstance = GetModuleHandle(0);
ifstream infile(filename, ios::binary);
if (!infile)
std::cout << "Wave::file error: " << filename << std::endl;
return;
infile.seekg (0, ios::end);
int length = infile.tellg();
buffer = new char[length];
infile.seekg (0, ios::beg);
infile.read (buffer, length);
infile.close();
ok = true;
Wave::~Wave()
PlaySound(NULL, 0, 0);
delete [] buffer;
void Wave::play(bool async)
if (!ok)
return;
if (async)
PlaySound(buffer, HInstance, SND_MEMORY | SND_ASYNC);
else
PlaySound(buffer, HInstance, SND_MEMORY);
bool Wave::isok()
return ok;
int main(int argc, char *argv[])
std::cout << "Trying to play sound...\n";
Wave one("drake.wav");
one.play();
std::cout << "press key to exit";
getch();
return 0;
**编辑:感谢大家的帮助。我花了一段时间才弄清楚这一点。
这就是我所做的:
1) 我将 .wav 文件放在根文件夹中。 2)我去了: 项目 特性 项目的构建选项 搜索目录 资源编译器
我将文件的位置放在资源编译器中。
**
【问题讨论】:
是的,可能是文件位置问题。请记住(或学习!)Code::Blocks 以项目的根目录作为当前目录运行您的可执行文件。从 Windows 资源管理器(或 linux equiv)运行 exe 以 它的文件夹作为当前目录 运行程序。打开文件时使用当前目录,并且 (0) 未指定完整路径或 (1) 未指定相对路径。 另外,WAV 格式非常简单,如果您读过 Petzold 的书,您会发现使用声音硬件相当简单。大约 200 行代码允许您从磁盘读取文件并自己将其发送到声卡。自然,您拥有比 PlaySound 提供给您的控制权远远更大的控制权。例如,能够播放磁盘上不存在的声音,或加快/减慢播放速度。录制一个音符然后改变播放速率会改变音高(不幸的是,持续时间) 声音很有趣。 :) 【参考方案1】:您的代码中有一个检查:
ifstream infile(filename, ios::binary);
if (!infile)
std::cout << "Wave::file error: " << filename << std::endl;
return;
所以,问题似乎很简单:找不到文件。这意味着这个问题不是关于PlaySound
,而是关于文件的打开。
你需要使用完整路径(类似Wave one("c:\\project\\drake.wav");
)或将wav文件放在程序的目录中(如果你从IDE运行程序,程序的当前路径可能会让你有点意外- 不是可执行文件的路径,而是项目文件的路径或类似的东西)。
【讨论】:
以上是关于C++ 中的 Playsound:.wav 文件的文件错误的主要内容,如果未能解决你的问题,请参考以下文章