none
wav形式ファイルを再生できない

    質問

  • C++/CLIでサウンドファイルを再生したくても再生することが出来ません。

      System::Media::SoundPlayer^ player = gcnew System::Media::SoundPlayer(L"ファイル名.wav");
      player->Play();

    このようにプログラムを組んだのですが、再生されませんでした。

    何故でしょうか?

    2018年8月26日 7:51

すべての返信

  • "ファイル名.wav" で指定されたファイルは exe と同じディレクトリに存在していますか?存在している場合は、GetCurrentDirectory 関数で取得されるディレクトリの場所は exe と同じ場所になっていますでしょうか?または、フルパスでサウンドファイルを指定して再生されますでしょうか?

    try
    {
    	System::Media::SoundPlayer^ player = gcnew System::Media::SoundPlayer(L"ファイル名.wav");
    	player->Play();
    }
    catch (System::Exception^ e)
    {
    	System::Console::WriteLine(e->Message);
    }

    というように例外をキャッチすると原因がわかるかもしれません。

    2018年8月26日 8:19
  • 回答ありがとうございます。

    exeファイルと同じフォルダに存在しているので、()内には、ファイル名.wavを指定しています。

    しかし再生されませんでした。

    何かincludeしたり、宣言したり、dllファイルが必要だったりしますか?

    ==============================

    仰る通り、ファイルを認識できてなさそうです。

    "指定された場所にサウンド ファイルが存在することを確認してください。"というエラーが出てました。

    今回はWindowsFormアプリケーションなので、動画再生をaxWindowsMediaPlayerで試してみました。

    動画、これもexeファイルと同じ場所に配置し、パスは入れないで、L"ファイル名.mp4"と試してみると、動画は再生されました。

    何故、wavファイルは再生されないのでしょうか?

    • 編集済み Expressll 2018年8月26日 8:42
    2018年8月26日 8:26
  • Visual Studio で exe を実行させていますでしょうか?Visual Studio から実行させた場合は、カレントディレクトリと作成された exe の場所が異なることがあります。(私の環境の場合は Debug に exe が生成されましたが、カレントはその一つ上のフォルダになっていました。GetCurrentDirectory 関数で確認)

    カレントディレクトリは変動するものと考えて、フルパスで音声ファイルを指定するほうがよいと思います。例えば下記のように

    try
    {
    	TCHAR szSoundFilePath[MAX_PATH] = { 0 };
    	::GetModuleFileName(NULL, szSoundFilePath, _countof(szSoundFilePath));
    	::PathRemoveFileSpec(szSoundFilePath);
    	::PathAppend(szSoundFilePath, TEXT("ファイル名.wav"));
    	System::Media::SoundPlayer^ player = gcnew System::Media::SoundPlayer(gcnew System::String(szSoundFilePath));
    	player->Play();
    }
    catch (System::Exception^ e)
    {
    	System::Console::WriteLine(e->Message);
    }
    
    // #include <shlwapi.h>
    // #pragma comment(lib, "shlwapi")
    // が必要かも
    


    axWindowsMediaPlayer の方はファイルのサーチが違うのかな?

    2018年8月26日 9:11
  • WinFormなら、

    auto path = System::IO::Path::Combine(Application::StartupPath, L"ファイル名");

    が簡単かな。

    2018年8月26日 9:34
  • 諦めて、WindowsMediaPlayerで再生することにしました。

    WindowsMediaPlayerの再生が終わったら返される文字列の中身って分かりますでしょうか?

    このようなプログラムを組みたいです。

    (WindowsMediaPlayer変数->status == 再生が終わったときに返される文字列)

    2018年8月26日 10:58