2013-02-28 32 views
16

Tôi đang cố gắng phát một tệp âm thanh trong ứng dụng WPF của mình. Hiện nay tôi có cuộc gọi sau đây:Cách phát một tài nguyên Tập tin Âm thanh WPF

private void PlaySound(string uriPath) 
{ 
    Uri uri = new Uri(@"pack://application:,,,/Media/movepoint.wav"); 
    var player = new MediaPlayer(); 
    player.Open(uri); 
    player.Play(); 
} 

Bây giờ nếu tôi chỉ định Media/movepoint.wav như xây dựng hành động Content và tải nó như là một đường dẫn tập tin tương đối hoặc tuyệt đối nó hoạt động tốt, vì vậy tôi nghi ngờ điều này có cái gì để làm với các Pack URI, nhưng Tôi không thể cho cuộc sống của tôi tìm ra cái gì.

Mục tiêu là lưu trữ tệp dưới dạng tài nguyên để tệp không có sẵn trong thư mục đầu ra. Tôi có thể cung cấp bản sao WAV hoặc bản sao MP3.

Trả lời

10

Tôi đã thử điều này với một tệp hình ảnh, hoạt động giống như tệp âm thanh theo như uri có liên quan vì nó chỉ là một tài nguyên khác. Tôi đã sử dụng mã bên dưới về cơ bản khớp với những gì bạn có.

new Uri(@"pack://application:,,,/Resources/logo.png") 

Đảm bảo thư mục 'Media' của bạn không được lồng trong bất kỳ thư mục nào khác. Nếu có, bạn cần phải bao gồm thư mục đó.

Sử dụng .NET Framework 4.0, VS2012.

This link cung cấp mô tả khá tốt về toàn bộ gói "đồ vật".

EDIT

thêm nhiều nghiên cứu về vấn đề này dường như chỉ ra rằng những gì bạn muốn làm có thể không thực hiện được với các tập tin âm thanh hoặc video. Đoạn trích dưới đây được lấy từ phần nhận xét của this MSDN page.

Mặc dù bạn có thể khai báo một thể hiện của lớp này trong Extensible Application Markup Language (XAML), bạn không thể tải và chơi phương tiện truyền thông của nó mà không sử dụng mã. Để chỉ phát phương tiện trong XAML, hãy sử dụng MediaElement. Ngoài ra, nếu bạn khai báo một cá thể trong XAML, việc sử dụng thực tế duy nhất là để điền vào phần tử thuộc tính phần tử cho thuộc tính Trình phát.

Khi phân phối phương tiện với ứng dụng của mình, bạn không thể sử dụng tệp phương tiện làm tài nguyên dự án. Trong tệp dự án của bạn, bạn phải đặt loại phương tiện vào Nội dung và đặt CopyToOutputDirectory thành PreserveNewest hoặc Always.

MediaPlayer có thể được sử dụng ở hai chế độ khác nhau, tùy thuộc vào những gì là hướng người chơi: chế độ độc lập hoặc chế độ đồng hồ. Trong chế độ độc lập , MediaPlayer tương tự như hình ảnh và phương tiện được mở thông qua phương pháp Open sẽ phát lại. Trong chế độ Đồng hồ, MediaPlayer có thể được coi là mục tiêu cho hoạt ảnh và do đó, nó sẽ có các mục Thời gian và Đồng hồ tương ứng trong cây Timing điều khiển phát lại. Để biết thêm thông tin về các chế độ phương tiện, hãy xem Tổng quan đa phương tiện.

MediaPlayer khác với MediaElement ở chỗ nó không phải là điều khiển có thể được thêm trực tiếp vào giao diện người dùng (UI) của ứng dụng . Để hiển thị phương tiện được tải bằng MediaPlayer, bạn phải sử dụng VideoDrawing hoặc DrawingContext.

+0

Thoạt nhìn, tôi hơi bối rối vì cú pháp Gói URI của chúng tôi giống hệt nhau. Tuy nhiên, có điều gì đặc biệt về 'Resouces'? Ngay bây giờ thư mục Media nằm ở thư mục gốc của Assembly. Tôi có cần phải làm/Tài nguyên/Truyền thông/ không? Cảm ơn – xximjasonxx

+0

Chỉ cần thử PlaySound ("gói: // ứng dụng: ,,,/Resources/Media/movepoint.mp3"); Và không có may mắn để có được (có tôi cập nhật mã) :) – xximjasonxx

+1

Cảm ơn cho làm rõ. Tôi có thể hiểu tại sao họ lại làm điều này vì những rủi ro vi phạm bản quyền. Tôi đã đánh dấu câu trả lời của bạn là chính xác. Cảm ơn – xximjasonxx

1

Sau đây dường như làm việc trong .NET Framework 4.5:

var sri = Application.GetResourceStream(new Uri("pack://application:,,,/MyAssemblyName;component/Resources/CameraShutter.wav")); 

if ((sri != null)) 
{ 
    using (s == sri.Stream) 
    { 
    System.Media.SoundPlayer player = new System.Media.SoundPlayer(s); 
    player.Load(); 
    player.Play(); 
    } 
} 

CameraShutter.wav được nhúng như Resource trong dự án của tôi (và cư trú bên trong Tài nguyên thư mục con, như được chỉ ra trong gói URI).

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