2015-11-18 17 views
6

Sử dụng thư viện VLC được cung cấp bởi Vlc.DotNet, tôi đã cố thực hiện nó trong một WPF đơn giản.Thư mục Không tìm thấy Ngoại lệ hoặc FileNotFoundException trên VLC.DotNet

Tôi đã sao chép chính xác mã từ kho lưu trữ và nhận NuGet trực tuyến, nhưng dường như không làm cho nó hoạt động. Tôi nhận được một ngoại lệ Directory Not Found ngay từ tải của tập tin trên đĩa.

Đây là mã của tôi:

public MainWindow() 
    { 

     InitializeComponent(); 
     VLCControl.MediaPlayer.VlcLibDirectoryNeeded += OnVlcControlNeedsLibDirectory; 
    } 


    private void OnVlcControlNeedsLibDirectory(object sender, Vlc.DotNet.Forms.VlcLibDirectoryNeededEventArgs e) 
    { 
     var currentAssembly = Assembly.GetEntryAssembly(); 
     var currentDirectory = new FileInfo(currentAssembly.Location).DirectoryName; 
     if (currentDirectory == null) 
      return; 
     if (AssemblyName.GetAssemblyName(currentAssembly.Location).ProcessorArchitecture == ProcessorArchitecture.X86) 
      e.VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(currentDirectory, @"..\..\..\lib\x86\")); 
     else 
      e.VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(currentDirectory, @"..\..\..\lib\x64\")); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var d = new Microsoft.Win32.OpenFileDialog(); 
     d.Multiselect = false; 
     if (d.ShowDialog() == true) 
     { 
      Uri src = new Uri(d.FileName); 
      VLCControl.MediaPlayer.Play(src); //Exception here 
     } 
    } 

VLCControl là kiểm soát VLC trong XAML.

Bằng cách thay đổi VlcLibDirectory với một con đường nơi tôi đặt các thư viện (ví dụ thư mục gốc của ứng dụng), tôi nhận được StackTrace này:

tại Vlc.DotNet.Core.Interops.VlcInteropsManager..ctor (DirectoryInfo dynamicLinkLibrariesPath) tại Vlc.DotNet.Core.Interops.VlcManager..ctor (DirectoryInfo dynamicLinkLibrariesPath) tại Vlc.DotNet.Core.Interops.VlcManager.GetInstance (DirectoryInfo dynamicLinkLibrariesPath) tại Vlc.DotNet.Core.VlcMediaPlayer..ctor (DirectoryInfo vlcLibDirectory) tại Vlc.DotNet.Forms.VlcControl.EndInit() tại Vl c.DotNet.Forms.VlcControl.Play (Uri uri, String [] tùy chọn) tại VLCTest.MainWindow.Button_Click (đối tượng người gửi, RoutedEventArgs e) trong c: \ Users \ ME \ Documents \ Visual Studio 2013 \ Projects \ VLCTest \ VLCTest \ MainWindow.xaml.cs: ligne 56

mã này trở thành:

if(AssemblyName.GetAssemblyName(currentAssembly.Location).ProcessorArchitecture == ProcessorArchitecture.X86) 
    e.VlcLibDirectory = new DirectoryInfo(currentDirectory); 
else 
    e.VlcLibDirectory = new DirectoryInfo(currentDirectory); 

Cảm ơn bạn đã giúp đỡ của bạn.

+0

Bạn bắt đầu từ VS? Đi từ currentDirectory là có một thư mục x86 hoặc x64 (".. \ .. \ .. \ lib \ x86 \") – Jehof

+0

@Default Chắc chắn, vì nó là một đường dẫn từ tệp bạn nhận được từ FileDialog. @ Jehof, Ngoại lệ xảy ra khi tệp tải, không phải chính trình phát. Người chơi thực sự có được con đường tốt cho 'VlcLibDirectory' (tôi nghĩ vậy?), Nhờ vào thư viện – JoJoeTheBear

+0

@Jehof Xin lỗi vì bình luận đôi. Có trong VS. – JoJoeTheBear

Trả lời

2

Vấn đề chắc chắn là với đường dẫn thư viện của bạn, mặc dù bạn phải tự khắc phục sự cố để tìm sự khác biệt chính xác giữa đường dẫn được cung cấp và đường dẫn thực tế.

Sự hiểu lầm có thể là thư viện nào bị thiếu. Bạn có Vlc.DotNet.Core.Interops.dll nhưng bạn đang thiếu các thư viện nativ phía sau. Đây là lý do, tại sao ngoại lệ xảy ra bên trongVlc.DotNet.Core.Interops.dll khi cố tải các thư viện thực.

Chức năng OnVlcControlNeedsLibDirectory được gọi bên trong VLCControl.MediaPlayer.Play(src);, do đó đường dẫn từ OpenFileDialog không liên quan gì đến vấn đề này.

bước tôi chụp để tái tạo/sửa chữa:

  • Downloaded dự án của bạn
  • Tested/Debugged
    • ngoại lệ xảy ra như bạn mô tả
  • Downloaded các thư viện từ Vlc.kho DotNet
  • Thay đổi các đường dẫn đến các giá trị tuyệt đối
  • Tested/Debugged lại
    • chơi thành công một tập tin âm nhạc
    • ngoại lệ khác xảy ra vào đóng (câu chuyện khác nhau alltogether)

Bố cục thư mục của tôi:

Đường dẫn giải pháp:

D: \ Programmierung \ VLCTest-VAlphaTesting \ VLCTest-VAlphaTesting \

thực tế vị trí hội về thực hiện

D: \ Programmierung \ VLCTest-VAlphaTesting \ VLCTest-VAlphaTesting \ VLCTest \ bin \ Debug

ProcessorArchitecture: x86

Thư viện Đường dẫn:

D: \ Programmierung \ Vlc.DotNet-master \ Vlc.DotNet-master \ lib \ x86

Nội dung đường dẫn thư viện:

plugins (thư mục)

. giữ (tệp)

libvlc.dll (tệp)

libvlccore.dll (file)

Đối với mục đích thử nghiệm tôi hardcoded đường dẫn thư viện - bạn có thể muốn làm điều đó cũng

if (AssemblyName.GetAssemblyName(currentAssembly.Location).ProcessorArchitecture == ProcessorArchitecture.X86) 
    e.VlcLibDirectory = new DirectoryInfo(@"D:\Programmierung\Vlc.DotNet-master\Vlc.DotNet-master\lib\x86"); 
else 
    e.VlcLibDirectory = new DirectoryInfo(@"D:\Programmierung\Vlc.DotNet-master\Vlc.DotNet-master\lib\x64"); 
+0

Đó là một câu trả lời rất hay.Tôi có thể hỏi: Làm cách nào bạn tìm thấy lỗi lib gốc? Tôi đã cố gắng thực thi dự án gốc nhưng nó không hoạt động và không thể Tôi sẽ kiểm tra các giải pháp ngay sau khi tôi về nhà và chấp nhận câu trả lời.Chú mừng – JoJoeTheBear

+0

Câu trả lời có thể là một chút không đạt yêu cầu, nhưng nó đã được nhiều hơn hoặc ít trực giác.Tôi đã không bận tâm với bất cứ điều gì giống như dự án bản địa. những suy nghĩ sau đây: (1) nuget tự nó làm đúng - có nghĩa là, không có n eed để chăm sóc bất cứ điều gì trong Vlc.DotNet. * thư viện. (2) Interop là một tên điển hình cho một người hòa giải giữa các công cụ DotNet và các giao diện nguyên bản bên ngoài. (3) phân biệt giữa x86 và x64 cũng cho thấy sự tham gia của các thư viện gốc. (4) thiết lập con đường đúng sau khi chắc chắn vấn đề là một shot, vì vậy tôi đã không nghĩ đến nhiều ở đây – grek40

+0

Vâng, tôi nghĩ rằng tôi sẽ không tìm thấy một mình. Bây giờ tôi có một vấn đề để thử biên dịch trong 64 bit, nhưng một vấn đề tại một thời điểm. Cảm ơn sự giúp đỡ của bạn. – JoJoeTheBear

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