2012-10-14 29 views
5

Có thay thế "hiện đại" cho chức năng Windows sndPlaySound() cũ, đây là cách rất thuận tiện để phát tệp .wav trong nền trong khi bạn tập trung vào các vấn đề khác không? Bây giờ tôi thấy mình cần phải chơi một tập tin .mp3 trong nền và tôi tự hỏi làm thế nào để thực hiện điều tương tự trong một cách tương đối dễ dàng mà hệ thống hỗ trợ vốn có. Có lẽ có một thành phần COM để hoàn thành phát lại .mp3 cơ bản?đơn giản .wav hoặc .mp3 playbck trong Windows - nó đã biến mất ở đâu?

+0

[Hai đề xuất ở đây] (http://stackoverflow.com/questions/8121570/use-windows-built-in-mp3-decoder-to-play-audio). – arx

Trả lời

0

Khi bạn nói "Hiện đại", bạn có nghĩa là API Windows 8 WinRT không? Hoặc bạn có nghĩa là, "một API hơi mới hơn so với những người phát minh ra cho Windows 3.1"?

Một cuộc khảo sát của apis âm thanh và video có thể được tìm thấy here

Đối với các ứng dụng cổ điển máy tính để bàn Windows, có PlaySound, có thể chơi bất kỳ tập tin WAV.

Đối với MP3, nhóm của tôi đã phát minh ra giải pháp bằng DirectSound và Windows Media Format SDK. Sau này có thể giải mã bất kỳ tệp WMA và MP3 nào. Chúng tôi đã đưa luồng âm thanh trực tiếp vào bộ đệm DSound. Đây không phải là dành cho những người yếu tim.

Bạn có thể sử dụng giải pháp thay thế cấp cao hơn, Windows Media Player API.

DirectShow là một giải pháp thay thế rất kế thừa, nhưng rất dễ dàng để có được thứ gì đó hoạt động. Media Foundation là sự thay thế cho DirectShow.

+0

PlaySound là một giải pháp cổ xưa nhưng đầy đủ, đặc biệt là khi thời gian để thực hiện một cái gì đó tinh vi hơn không thể được biện minh. Tôi đã chỉ hy vọng cho một cái gì đó tương đương với iOS AVAudioPlayer, nơi bạn có thể thực hiện điều này với khoảng năm dòng mã. Đây là Win32 mặc dù. Thở dài ... –

1

Câu trả lời đơn giản cho nhiều vấn đề như thế này là chỉ cần gọi ra một chương trình dòng lệnh với hệ thống ("play.exe soundfile.mp3") hoặc tương đương. Chỉ cần xử lý dòng lệnh như một API khác, một API có chức năng mở rộng và là chuẩn, di động, linh hoạt, dễ gỡ lỗi và dễ sửa đổi. Nó có thể không hiệu quả như gọi một hàm thư viện nhưng điều đó thường không quan trọng, đặc biệt nếu chương trình được gọi là đã có trong bộ nhớ cache của đĩa. Ngẫu nhiên, tránh sự phức tạp của phần mềm chỉ vì nó "hiện đại"; thường đó là bằng chứng của một phi hành gia kiến ​​trúc và thực hành lập trình kém.

2

Qua nhiều năm đã có một vài API liên quan đến âm thanh và phương tiện và có một số cách để đạt được mục tiêu.

Điều tốt nhất về việc không có libs của bên thứ ba, phạm vi phiên bản hệ điều hành tốt nhất, tính năng và đơn giản là API DirectShow. 15 tuổi và vẫn đánh bại địa ngục của các đối thủ, được hỗ trợ trong tất cả các phiên bản Windows hiện tại và một vài phiên bản trước của Visual Studio có thể nhắm mục tiêu, ngoại trừ WinRT.

Đoạn mã bên dưới phát các tệp MP3 và WMA. Nó là C++ tuy nhiên vì nó là tất cả COM nó cũng di động trên các ngôn ngữ.

#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; 
} 

Nếu bạn đang phát tệp của riêng mình, bạn chắc chắn không chứa phần thẻ ID3 lớn, the code might be twice as short.

Các vấn đề liên quan