2012-10-14 32 views
5

क्या पुराने विंडोज sndPlaySound() फ़ंक्शन के लिए "आधुनिक" प्रतिस्थापन है, जो कि अन्य मामलों पर ध्यान केंद्रित करते समय पृष्ठभूमि में .wav फ़ाइल चलाने का एक बहुत सुविधाजनक तरीका था? अब मुझे पृष्ठभूमि में एक। एमपी 3 फ़ाइल चलाने की ज़रूरत है और मैं सोच रहा हूं कि एक ही चीज़ को अपेक्षाकृत आसान तरीके से कैसे पूरा किया जाए, जो सिस्टम मूल रूप से समर्थन करता है। शायद मूल। एमपी 3 प्लेबैक को पूरा करने के लिए एक COM घटक है?विंडोज़ में सरल। वाव या। एमपी 3 प्लेबैक - यह कहां गया है?

+0

[यहां सुझावों का जोड़ा] (http://stackoverflow.com/questions/8121570/use-windows-built-in-mp3-decoder-to-play-audio)। – arx

उत्तर

0

जब आप "आधुनिक" कहते हैं, तो क्या आपका मतलब विंडोज 8 WinRT API है? या आपका मतलब है, "Windows 3.1 के लिए आविष्कार किए गए एपीआई से थोड़ा नया"?

ऑडियो और वीडियो apis के एक सर्वेक्षण here

पाया जा सकता है क्लासिक विंडोज डेस्कटॉप अनुप्रयोगों के लिए, वहाँ PlaySound, जो किसी भी WAV फ़ाइल खेल सकते हैं है।

एमपी 3 के लिए, मेरी टीम ने डायरेक्टसाउंड और Windows Media Format SDK का उपयोग करके एक समाधान का आविष्कार किया। उत्तरार्द्ध किसी भी डब्लूएमए और एमपी 3 फ़ाइल को डीकोड कर सकता है। हमने ऑडियो स्ट्रीम को सीधे डीएसएंड बफर में खिलाया। यह ह्दय के मंद होने के लिए नहीं है।

आप उच्च स्तर के वैकल्पिक, Windows Media Player API का उपयोग कर सकते हैं।

DirectShow एक बहुत ही विरासत विकल्प है, लेकिन कुछ हासिल करना और काम करना आसान है। Media Foundation डायरेक्टशो के प्रतिस्थापन है।

+0

प्लेसाउंड एक प्राचीन लेकिन पर्याप्त समाधान है, खासकर जब कुछ और परिष्कृत करने के लिए समय को उचित नहीं ठहराया जा सकता है। मैं बस आईओएस AVAudioPlayer के बराबर कुछ की उम्मीद कर रहा था, जहां आप इसे कोड की लगभग पांच पंक्तियों के साथ पूरा कर सकते हैं। हालांकि यह Win32 है। आह ... –

1

इस तरह की कई समस्याओं का एक सरल जवाब सिस्टम ("play.exe soundfile.mp3") या समकक्ष के साथ एक कमांड लाइन प्रोग्राम पर कॉल करना है। बस कमांड लाइन को एक और एपीआई के रूप में देखें, एक एपीआई जिसमें व्यापक कार्यक्षमता है और मानक, पोर्टेबल, लचीला, डीबग करने में आसान और संशोधित करने में आसान है। यह लाइब्रेरी फ़ंक्शन को कॉल करने के रूप में उतना कुशल नहीं हो सकता है, लेकिन इससे कोई फर्क नहीं पड़ता, विशेष रूप से यदि प्रोग्राम को कॉल किया जा रहा है तो डिस्क कैश में पहले से ही है। संयोग से, सॉफ्टवेयर जटिलता से बचें क्योंकि यह "आधुनिक" है; अक्सर यह एक वास्तुकला अंतरिक्ष यात्री और खराब प्रोग्रामिंग अभ्यास का सबूत है।

2

वर्षों से कुछ ऑडियो और मीडिया संबंधित एपीआई रहे हैं और लक्ष्य प्राप्त करने के कुछ तरीके हैं।

तीसरे पक्ष के libs, सर्वोत्तम ओएस संस्करण कवरेज, फीचर सेट और सादगी की अनुपस्थिति के मामले में सबसे अच्छा DirectShow API है। 15 साल पुराना और अभी भी प्रतिद्वंद्वियों से बाहर निकलता है, विंडोज़ के सभी संस्करणों में समर्थित है और विजुअल स्टूडियो के पिछले कुछ संस्करण WinRT को छोड़कर लक्षित कर सकते हैं।

नीचे कोड स्निपेट एमपी 3 और डब्लूएमए फाइलों को चलाता है। यह 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; 
} 

आप अपने खुद के फ़ाइलों को चलाने रहे हैं, तो आप, बड़े ID3 टैग वर्गों को शामिल नहीं करने के लिए the code might be twice as short यकीन कर रहे हैं।