2012-10-14 5 views
5

古いWindows sndPlaySound()関数の代わりに「モダンな」ものがあります。これは、他の事項に集中しながら、バックグラウンドで.wavファイルを再生する非常に便利な方法でした。私は今、バックグラウンドで.mp3ファイルを再生する必要があり、システムが本質的にサポートする比較的簡単な方法で同じことを達成する方法が不思議です。おそらく、基本的な.mp3再生を遵守するためのCOMコンポーネントがありますか?Windowsのシンプルな.wavまたは.mp3 playbck - どこに行ったのですか?

+0

[こちらの提案のいくつか](http://stackoverflow.com/questions/8121570/use-windows-built-in-mp3-decoder-to-play-audio) – arx

答えて

0

"Modern"と言えば、Windows 8 WinRT APIを意味しますか?それとも、「Windows 3.1用に開発されたAPIよりも少し新しいAPI」という意味ですか?オーディオとビデオのAPIの調査では、古典的なWindowsデスクトップアプリケーションの場合here

を見つけることができます

、任意のWAVファイルを再生することができますPlaySoundは、あります。

MP3の場合、私のチームはDirectSoundとWindows Media Format SDKを使用したソリューションを発明しました。後者は、WMAとMP3ファイルをデコードできます。オーディオストリームをDSoundバッファに直接送りました。これは、かすかな心のためではありません。

より高いレベルの代替品であるWindows Media Player APIを使用する可能性があります。

DirectShowは非常に遺憾な選択肢ですが、何かを手に入れて作業するのは簡単です。 Media FoundationはDirectShowの代わりです。

+0

PlaySoundは古代ではあるが十分な解決策であり、特に洗練されたものを実装する時間を正当化することができない場合には適している。私はiOS AVAudioPlayerに相当するものを期待していました。ここでは、約5行のコードでこれを達成できます。これはWin32です。一口... –

1

このような多くの問題に対する簡単な答えは、単にsystem( "play.exe soundfile.mp3")または同等のコマンドラインプログラムを呼び出すことです。コマンドラインを広範な機能を持ち、標準のポータブルで柔軟性があり、デバッグしやすく、変更しやすいAPIである別のAPIとして扱いましょう。ライブラリ関数を呼び出すのと同じくらい効率的ではないかもしれませんが、特に呼び出されているプログラムがすでにディスクキャッシュに入っている場合は問題になりません。ちなみに、ソフトウェアの複雑さは、それが「近代的」なので避けてください。それはしばしば建築の宇宙飛行士とプログラミングの習慣が悪いという証拠です。

2

オーディオとメディアに関連するAPIがいくつかあり、目標を達成するにはいくつかの方法があります。

第三者のライブラリがないこと、最高のOSバージョンのカバレッジ、機能セット、そしてシンプルさという点で、DirectShow APIが最適です。 WinRTを除く現在のバージョンと以前のバージョンのVisual Studioが対象とするWindowsのすべてのバージョンでサポートされています。

以下のコードスニペットは、MP3およびWMAファイルを再生します。それはC++ですが、すべてのCOMなので、言語間で移植性があります。あなたがあなた自身のファイルを再生している場合

#include "stdafx.h" 
#include <dshow.h> 
#include <dshowasf.h> 
#include <atlcom.h> 

#pragma comment(lib, "strmiids.lib") 

#define V(x) ATLVERIFY(SUCCEEDED(x)) 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    static LPCTSTR g_pszPath = _T("F:\\Music\\Cher - Walking In Memphis.mp3"); 
    V(CoInitialize(NULL)); 
    { 
     CComPtr<IGraphBuilder> pGraphBuilder; 
     V(pGraphBuilder.CoCreateInstance(CLSID_FilterGraph)); 
     CComPtr<IBaseFilter> pBaseFilter; 
     V(pBaseFilter.CoCreateInstance(CLSID_WMAsfReader)); 
     CComQIPtr<IFileSourceFilter> pFileSourceFilter = pBaseFilter; 
     ATLASSERT(pFileSourceFilter); 
     V(pFileSourceFilter->Load(CT2COLE(g_pszPath), NULL)); 
     V(pGraphBuilder->AddFilter(pBaseFilter, NULL)); 
     CComPtr<IEnumPins> pEnumPins; 
     V(pBaseFilter->EnumPins(&pEnumPins)); 
     CComPtr<IPin> pPin; 
     ATLVERIFY(pEnumPins->Next(1, &pPin, NULL) == S_OK); 
     V(pGraphBuilder->Render(pPin)); 
     CComQIPtr<IMediaControl> pMediaControl = pGraphBuilder; 
     CComQIPtr<IMediaEvent> pMediaEvent = pGraphBuilder; 
     ATLASSERT(pMediaControl && pMediaEvent); 
     V(pMediaControl->Run()); 
     LONG nEventCode = 0; 
     V(pMediaEvent->WaitForCompletion(INFINITE, &nEventCode)); 
    } 
    CoUninitialize(); 
    return 0; 
} 

あなたがthe code might be twice as short、大ID3タグのセクションが含まれていないのは確実です。

関連する問題