2010-03-21 12 views
7
WaveStream waveStream = new Mp3FileReader(mp3FileToPlay); 
var waveOut = new WaveOut(); 
waveOut.Init(waveStream); 
waveOut.Play(); 

này ném một ngoại lệ:Làm thế nào để chơi một file MP3 sử dụng NAudio

WaveBadFormat gọi waveOutOpen

Các loại mã hóa là "MpegLayer3" như NAudio.

Tôi làm cách nào để phát tệp mp3 bằng NAudio?

Trả lời

7

Hãy thử như thế này:

class Program 
{ 
    static void Main() 
    { 
     using (var ms = File.OpenRead("test.mp3")) 
     using (var rdr = new Mp3FileReader(ms)) 
     using (var wavStream = WaveFormatConversionStream.CreatePcmStream(rdr)) 
     using (var baStream = new BlockAlignReductionStream(wavStream)) 
     using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) 
     { 
      waveOut.Init(baStream); 
      waveOut.Play(); 
      while (waveOut.PlaybackState == PlaybackState.Playing) 
      { 
       Thread.Sleep(100); 
      } 
     } 
    } 
} 

Sửa mã này bây giờ đã hết hạn (liên quan đến NAudio 1.3). Không được khuyến nghị trên các phiên bản mới hơn của NAudio. Vui lòng xem câu trả lời thay thế.

+1

này không hoạt động. "InvalidParameter gọi acmStreamPrepareHeader" – Rookian

+0

Tôi vừa tải xuống phiên bản mới nhất của NAudio (http://www.codeplex.com/naudio) và đã thử nghiệm mã này bằng mp3 trên máy tính của mình. Nó làm việc cho tôi. –

+0

Bạn có môi trường 64 bit không? Tôi đã biên dịch lại các giải pháp bằng cách sử dụng x64, chế độ phát hành và thay đổi nền tảng. Net từ .NET 2.0 đến 3.5 ... có lẽ vì điều này tôi nhận được các lỗi? – Rookian

28

Đối với người dùng từ NAudio 1.6 trở lên, vui lòng không sử dụng mã trong câu trả lời được chấp nhận ban đầu. Bạn không cần phải thêm WaveFormatConversionStream hoặc BlockAlignReductionStream và bạn nên tránh sử dụng WaveOut với hàm gọi lại (WaveOutEvent là thích hợp hơn nếu bạn không ở trong ứng dụng WinForms hoặc WPF). Ngoài ra, trừ khi bạn muốn chặn phát lại, bạn sẽ không thường ngủ cho đến khi kết thúc âm thanh. Chỉ cần đăng ký sự kiện PlaybackStopped của WaveOut.

Đoạn mã dưới đây sẽ chỉ làm việc tốt để đóng một MP3 trong NAudio:

reader = new Mp3FileReader("test.mp3"); 
var waveOut = new WaveOut(); // or WaveOutEvent() 
waveOut.Init(reader); 
waveOut.Play(); 
+0

Xin chào, cảm ơn bạn đã trả lời. Tôi muốn biết, theo câu trả lời của bạn, tập tin "test.mp3" nên được đặt ở đâu? – Eido95

+1

Chà. Một câu trả lời bình chọn cao với mã chính xác như được viết bởi OP - hoặc chính xác là sự khác biệt ở đâu? Tôi không thể phát hiện ra. –

+0

WaveOut là dùng một lần nhưng không bao giờ được xử lý trong mã của bạn. Nếu bạn vứt bỏ nó, âm thanh sẽ ngừng phát. Nếu bạn không vứt bỏ nó, nó sẽ có khả năng chỉ chơi cho đến khi thu gom rác thu thập nó. –