2008-08-30 10 views
18

C#/.Net에서 압축 된 사운드 파일을 재생할 수있는 특허가 아닌 휴대용 방식이 있습니까? 프로그램에서 발생하는 다양한 사건에 대한 짧은 "딸랑 소리"소리를 내고 싶습니다.어떻게 C#으로 압축 된 사운드 파일을 휴대용 방식으로 재생할 수 있습니까?

System.Media.SoundPlayer은 WAV 만 처리 할 수 ​​있지만 일반적으로 다운로드 가능한 응용 프로그램에 포함 시키기에는 큰 편입니다. MP3는 특허로 보호되어 있으므로 완벽하게 관리되는 디코더/플레이어가 있어도 재배포가 자유롭지는 않습니다. 사용할 수있는 최상의 형식은 OGG Vorbis 인 것 같지만 작동하려면 C# Vorbis 라이브러리를 얻지 못했습니다. (csvorbis으로 원시 PCM을 추출 할 수 있었지만 이후에 재생하는 방법을 모르겠습니다).

내 응용 프로그램과 함께 바이너리를 배포하거나 P/Invoke에 의존하지 않고 프로젝트가 적어도 Windows 및 Linux에서 실행되어야하므로. GPL과 라이센스 호환이 가능한 한 .NET 어셈블리를 번들링해도 좋습니다.

내가 마지막으로, BrokenGlass on writing WAVE header에서 업데이트 csvorbis을 도움을 사용하여,이 주제를 재검토하고,

답변

6

[이 질문은 일년 전에 mailing list discussion on mono-dev 메일 링리스트에 후속이다]. System.Media.SoundPlayer에 전달할 수있는 OggDecodeStream을 추가하여 (호환되는) Ogg Vorbis 스트림을 재생하기 만하면됩니다. 사용 예 :

using (var file = new FileStream(oggFilename, FileMode.Open, FileAccess.Read)) 
{ 
    var player = new SoundPlayer(new OggDecodeStream(file)); 
    player.PlaySync(); 
} 

'호환 가능'은 '시험해 볼 때 효과가 있음'을 의미합니다. 디코더는 완벽하게 관리되고 Microsoft .Net에서 잘 작동합니다. 현재 Mono의 SoundPlayer에 왜곡 현상이 발생하는 것으로 회귀 한 것으로 보입니다. 오래된

는 :

System.Diagnostics.Process.Start("fullPath.mp3");

나는 당황 스럽네요하지만 method Dinah mentioned 실제로 작동합니다. 그러나, 나는 프로그램에서 발생하는 다양한 이벤트에 짧은 "딸깍 소리가"소리를내는 것에 대해 생각하고 있었고, 나는 '핑 (ping)'을해야 할 때마다 사용자의 미디어 플레이어를 시작하고 싶지 않습니다. 소리.

코드 프로젝트 링크는 불행히도 P/Invoke 래퍼입니다.

+0

사용자가 MP3 플레이어를 설치 한 경우에만 * 작동 *한다고 가정합니다. 맞습니까? –

+0

MP3 확장 프로그램에 대한 기본 응용 프로그램이 컴퓨터에 정의되어 있으면이 응용 프로그램을 실행하여 "작동"합니다. 나는 대답을 모른다. (또는 나는 대답 할 것이다.) 그러나 상호 운용성이 당신의 목표라면, 나는 더 좋은 방법을 찾으려고 노력할 것이다. –

+0

위의 의견은 더 이상 업데이트 된 답변에 적용되지 않습니다. – skolima

1

소리를 재생하려면 'System.Diagnostics'에있는 것을 호출하면 나에게 상당히 나쁜 생각처럼 보입니다. 프로젝트 적어도 Windows 및 리눅스에서 실행해야합니다으로, P/호출에 따라

// 
    // Summary: 
    //  Starts a process resource by specifying the name of a document or application 
    //  file and associates the resource with a new System.Diagnostics.Process component. 
    // 
    // Parameters: 
    // fileName: 
    //  The name of a document or application file to run in the process. 
    // 
    // Returns: 
    //  A new System.Diagnostics.Process component that is associated with the process 
    //  resource, or null, if no process resource is started (for example, if an 
    //  existing process is reused). 
    // 
    // Exceptions: 
    // System.ComponentModel.Win32Exception: 
    //  There was an error in opening the associated file. 
    // 
    // System.ObjectDisposedException: 
    //  The process object has already been disposed. 
    // 
    // System.IO.FileNotFoundException: 
    //  The PATH environment variable has a string containing quotes. 
2

내 응용 프로그램과 어떤 바이너리를 배포하지 않으려는 어느 쪽도 : 여기에 그 함수가 무엇을 의미하는지입니다 . 나는 GPL과 라이센스 호환이 가능한 한 번들 .Net 어셈블리를 사용하는 것이 좋습니다.

유감스럽게도 바이너리 배포를 피하거나 P/Invoke를 피할 수 없습니다. 닷넷 클래스 라이브러리는 어쨌든 P/Invoke를 사용하며, 관리 코드는 언 매니지 오퍼레이팅 시스템 API와 어떤 점에서 통신해야한다.

OGG 파일을 PCM으로 변환하는 것은 관리 코드에서 가능해야하지만 오디오에서 기본 지원이 없기 때문에 가능합니다.그물, 당신은 정말 3 가지 옵션이 있습니다 :

  1. 전화 (이전 제안) 사운드를 재생하기 위해 외부 프로그램을

  2. P/소리를

  3. P를 재생하기 위해 C 모듈을 호출/사운드를 재생하려면 OS API를 호출하십시오.

(4.) Windows에서만이 코드를 실행하는 경우에는 DirectShow를 사용할 수 있습니다.

당신의 (a OGG C lib 디렉토리 또는 관리 코드, MP3와 라이센스 문제가 물론이 http://www.robburke.net/mle/mp3sharp/ 같은 것을 사용) PCM 데이터를 일단

P/호출은 크로스 플랫폼 방식 http://www.mono-project.com/Interop_with_Native_Libraries#Library_Names

에서 사용할 수 있습니다 불행하게도 .net은 사운드 카드 나 스트리밍 오디오 재생 방법을 직접 평가하지 않습니다. 시작할 때 ogg 파일을 PCM으로 변환 한 다음 System.Media.SoundPlayer를 사용하여 생성 된 wav 파일을 재생할 수 있습니다. 현재 Microsoft에서 P/Invoke를 사용하여 OS의 사운드 재생 API에 액세스합니다. http://msdn.microsoft.com/en-us/library/ms229685.aspx

PCM 사운드를 재생하는 크로스 플랫폼 API는 OpenAL이며 OpenAL 용 C# 바인딩을 사용하여 (PCM) 사운드를 재생할 수 있어야합니다. www.taoframework.com을 사용하면 불행히도 여러 개의 DLL과 .so 파일을 배포 할 때 응용 프로그램과 함께 복사해야합니다.하지만 이전에 피할 수 없었던 것처럼 설명했습니다.

0

게임 처리에 다른 것을 사용하지 않으면이 작업을 수행 할 방법이 없습니다.

System.Diagnostic을 사용하면 외부 소프트웨어가 실행되며, 원하지 않을지 의심 스럽습니까? 프로그램에서 Y가 발생할 때 백그라운드에서 X 사운드 파일을 재생하기 만하면됩니다.

흥미로운 질문으로 보았기 때문에 투표했습니다. : D

0

에 대한 꿈을 주시기 바랍니다 모든 오디오 API의 어머니 인 FMOD를 찾아 보게해야한다고 생각 응용 프로그램 및이 응용 프로그램에 대해 아름답게 작동합니다. 여러 사운드의 동시 재생과 함께 이벤트 기반 트리거링. 정확히 당신이 원하는. 아, 그리고 압축.

+1

이것은 휴대용이 아니며 Mono에서 XNA가 지원되지 않으며 포트가 대부분 죽습니다. http://www.monoxna.org/node/4 – skolima

+0

MonoGame을 참조하십시오. 작동 및 정기적으로 업데이트됩니다. –

0

음, 특정 국가의 특허 관련 법률에 따라 다르지만, 알고있는 한 특허 침해없이 mp3 디코더를 작성할 수있는 방법은 없습니다. 나는 당신의 문제에 가장 적합한 크로스 플랫폼, 오픈 소스 솔루션이 GStreamer이라고 생각한다. C# 바인딩은 빠르게 발전합니다. 그러나 Windows에서 GStreamer를 사용하고 구축하는 것은 쉬운 일이 아닙니다. Here은 좋은 출발점입니다. Banshee 프로젝트에서는이 방법을 사용하지만 아직 실제로는 사용할 수 없습니다 (그러나 거의 야간 작업이 거의 이루어지지 않습니다). FMOD도 좋은 대안입니다. 불행히도 오픈 소스가 아니며 API가 어떻게 든 C 스타일로되어 있다는 것을 알게되었습니다.

0

이 여전히 관련성이 있는지 확실하지. 가장 간단한 해결책은 NAudio을 사용하는 것입니다.이 방법은 C#으로 작성된 관리되는 오픈 소스 오디오 API입니다. 시도해 볼 또 다른 것은 ffmpeg를 활용하고, ffplay.exe으로 프로세스를 생성하는 것입니다 (올바른 바이너리는 공유 된 빌드 아래 있음).

+0

아쉽게도 NAudio는 Windows에서만 작동하며 변경되지 않습니다 (Windows API에 따라 다름). Atsushi Eno는 Silverligth에 그의 블로그 인 http://veritas-vos-liberabit.com/monogatari/2009/03/에 csvorbis를 사용하는 몇 가지 예제를 게시했습니다.이 기능을 본격적인 C# 프레임 메모리 (예 : 사용하는 API는 Silverlight에서만 사용할 수 있습니다.) – skolima

+0

@skolima Silverlight를 사용하는 것이 크로스 플랫폼이기 때문에 좋은 생각 일 수 있으며 모든 OS에서 브라우저 외부에서 작동 할 수 있습니다. Linux에서이 소프트웨어를 사용해 본 적이 없지만 Mac에서는 정상적으로 작동합니다. – Dmitry