이식 가능한 방식으로 C#에서 압축된 사운드 파일을 재생하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/35896

문제

C#/.Net에서 압축된 사운드 파일을 재생하는 특허 제한이 아닌 이식 가능한 방법이 있습니까?프로그램에서 발생하는 다양한 이벤트에 대해 짧은 "징글" 소리를 재생하고 싶습니다.

시스템.미디어.사운드플레이어 WAV만 처리할 수 있지만 일반적으로 다운로드 가능한 애플리케이션에 포함하기에는 너무 큽니다.MP3는 특허로 보호되므로 완전히 관리되는 디코더/플레이어가 있더라도 자유롭게 재배포할 수 없습니다.사용 가능한 가장 좋은 형식은 OGG Vorbis인 것 같지만 C# Vorbis 라이브러리를 작동시키는 데에는 운이 없었습니다. (저는 다음을 사용하여 원시 PCM을 추출했습니다. csvorbis 하지만 나중에 어떻게 플레이해야 할지 모르겠습니다).

프로젝트는 최소한 Windows 및 Linux에서 실행되어야 하므로 내 애플리케이션과 함께 바이너리를 배포하거나 P/Invoke에 의존하고 싶지 않습니다.GPL과 라이센스 호환이 가능하다면 .Net 어셈블리를 번들링해도 괜찮습니다.

[이 질문은 다음 질문에 대한 후속 조치입니다. mono-dev에 대한 메일링 리스트 토론 1년 전 메일링 리스트]

도움이 되었습니까?

해결책

나는 마침내 이 주제를 다시 검토했고, WAVE 헤더 작성 시 BrokenGlass, csvorbis를 업데이트했습니다.나는 Ogg디코드스트림 전달할 수 있는 것 System.Media.SoundPlayer (호환되는) 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");

나는 놀랐지만, Dinah가 언급한 방법 실제로 작동합니다.그러나 나는 프로그램에서 발생하는 다양한 이벤트에서 짧은 "징글"사운드를 재생하는 것에 대해 생각하고 있었는데, 나는 '핑!'을해야 할 때마다 사용자 미디어 플레이어를 출시하고 싶지 않습니다. 소리.

코드 프로젝트 링크의 경우 이는 불행하게도 P/Invoke 래퍼일 뿐입니다.

다른 팁

프로젝트는 최소한 Windows 및 Linux에서 실행되기 때문에 응용 프로그램과 함께 바이너리를 배포하거나 P/Invoke에 의존하고 싶지 않습니다..NET 어셈블리가 gpl과 라이센스와 호환되는 한 번들을 묶는 것은 괜찮습니다.

불행히도 바이너리 배포를 피하거나 P/Invoke를 피하는 것은 불가능합니다..net 클래스 라이브러리는 어쨌든 아래에서 P/Invoke를 사용합니다. 관리 코드는 작업을 수행하기 위해 어느 시점에서 비관리 운영 체제 API와 통신해야 합니다.

OGG 파일을 PCM으로 변환하는 것은 관리 코드에서 가능해야 하지만 .net에는 오디오에 대한 기본 지원이 없기 때문에 실제로는 3가지 옵션이 있습니다.

  1. 외부 프로그램을 호출하여 사운드를 재생합니다(앞서 제안한 대로).

  2. P/C 모듈을 호출하여 사운드 재생

  3. P/OS API를 호출하여 사운드를 재생합니다.

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

P/Invoke는 크로스 플랫폼 방식으로 사용할 수 있습니다.http://www.mono-project.com/Interop_with_Native_Libraries#Library_Names

PCM 데이터가 있으면(OGG C Lib 또는 관리 코드 사용) 다음과 같습니다. http://www.robburke.net/mle/mp3sharp/ 물론 MP3에는 라이센스 문제가 있습니다) 재생 방법이 필요합니다. 불행하게도 .net은 사운드 카드에 대한 직접적인 평가나 스트리밍 오디오 재생 방법을 제공하지 않습니다.시작 시 ogg 파일을 PCM으로 변환한 다음 System.Media.SoundPlayer를 사용하여 생성된 wav 파일을 재생할 수 있습니다.Microsoft가 제안하는 현재 방법은 P/Invoke를 사용하여 OS의 사운드 재생 API에 액세스합니다. http://msdn.microsoft.com/en-us/library/ms229685.aspx

PCM 사운드를 재생하는 크로스 플랫폼 API는 OpenAL이며 www.taoframework.com에서 OpenAL용 C# 바인딩을 사용하여 (PCM) 사운드를 재생할 수 있어야 합니다. 안타깝게도 여러 DLL 및 .so 파일을 배포할 때 작동하려면 애플리케이션이 필요하지만 앞서 설명한 것처럼 이는 불가피합니다.

사운드를 재생하기 위해 'System.Diagnostics'에 있는 항목을 호출하는 것은 나에게는 꽤 나쁜 생각처럼 보입니다.해당 기능의 의미는 다음과 같습니다.

    //
    // 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.

내 생각에는 모든 오디오 API의 어머니인 fmod를 살펴봐야 할 것 같습니다.

제발 꿈을 꾸세요 http://www.fmod.org/index.php/download#FMODExProgrammersAPI

XNA 오디오 API는 .net/c# 애플리케이션에서 잘 작동하며 이 애플리케이션에서도 훌륭하게 작동합니다.여러 사운드의 동시 재생과 함께 이벤트 기반 트리거링.정확히 당신이 원하는 것입니다.아, 그리고 압축도 마찬가지죠.

글쎄요, 해당 국가의 특허 관련 법률에 따라 다르지만 제가 아는 한 특허를 위반하지 않고 mp3 디코더를 작성할 수 있는 방법은 없습니다.귀하의 문제에 대한 최고의 크로스 플랫폼 오픈 소스 솔루션은 다음과 같습니다. G스트리머.빠르게 발전하는 C# 바인딩이 있습니다.그러나 Windows에서 GStreamer를 사용하고 구축하는 것은 쉬운 작업이 아닙니다. 여기 좋은 출발점입니다. 반시 프로젝트에서는 이 접근 방식을 사용하지만 아직 Windows에서는 실제로 사용할 수 없습니다(그러나 거의 작동하는 야간 빌드가 일부 있습니다). FMOD 도 좋은 대안이다.불행하게도 이는 오픈 소스가 아니며 API가 어떻게든 C 스타일이라는 것을 알았습니다.

오픈 소스인 순수 C# vorbis 디코더가 있습니다.

http://anonsvn.mono-project.com/viewvc/trunk/csvorbis/

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

플레이 처리를 위해 다른 것을 사용하지 않고는 이를 수행할 수 있는 방법이 없습니다.

System.Diagnostic을 사용하면 외부 소프트웨어가 실행되는데 그렇게 하려는 것인지 의심스럽습니다. 그렇죠?프로그램에서 Y가 발생할 때 X 사운드 파일이 백그라운드에서 재생되기를 원합니다. 그렇죠?

흥미로운 질문인 것 같아서 투표했습니다.:디

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top