2015-11-18 6 views
6

Используя библиотеку VLC, предоставляемую Vlc.DotNet, я попытался реализовать ее в простом WPF.Directory Not Found Exception или FileNotFoundException на VLC.DotNet

Я скопировал именно код из репозитория и получил NuGet в Интернете, но, похоже, не может заставить его работать. Я получаю исключение Directory Not Found прямо из загрузки файла на диск.

Вот мой код:

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 является контроль VLC в XAML.

Изменяя VlcLibDirectory с другим путем, где я поставил библиотеки (например, корень приложения), я получаю эту StackTrace:

на Vlc.DotNet.Core.Interops.VlcInteropsManager..ctor (DirectoryInfo dynamicLinkLibrariesPath) на Vlc.DotNet.Core.Interops.VlcManager..ctor (DirectoryInfo dynamicLinkLibrariesPath) на Vlc.DotNet.Core.Interops.VlcManager.GetInstance (DirectoryInfo dynamicLinkLibrariesPath) в Vlc.DotNet.Core.VlcMediaPlayer..ctor (DirectoryInfo vlcLibDirectory) на Vlc.DotNet.Forms.VlcControl.EndInit() на Vl c.DotNet.Forms.VlcControl.Play (Uri uri, String []) в VLCTest.MainWindow.Button_Click (отправитель объекта, RoutedEventArgs e) в c: \ Users \ ME \ Documents \ Visual Studio 2013 \ Projects \ VLCTest \ VLCTest \ MainWindow.xaml.cs: Ligne 56

код становится:

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

Спасибо за вашу помощь.

+0

ли вы начать это с VS? Исходя из currentDirectory, есть папка x86 или x64 (".. \ .. \ .. \ lib \ x86 \") – Jehof

+0

@Default Это действительно так, потому что это путь из файла, который вы получаете из FileDialog. @Jehof, Исключение происходит, когда файл загружается, а не сам плеер. Игрок действительно получает хороший путь для 'VlcLibDirectory' (я думаю?), Благодаря библиотеке – JoJoeTheBear

+0

@Jehof Извините за двойной комментарий. Да в VS. – JoJoeTheBear

ответ

2

Проблема, безусловно, связана с вашим пути к библиотеке, хотя вам нужно самостоятельно отлаживать проблему, чтобы найти точное несоответствие между предоставленным путем и фактическим путем.

Непонимание может быть, какие библиотеки отсутствуют. У вас есть Vlc.DotNet.Core.Interops.dll, но у вас нет библиотек nativ. Именно по этой причине исключение возникает внутриVlc.DotNet.Core.Interops.dll, когда он пытается загрузить фактические библиотеки.

Функция OnVlcControlNeedsLibDirectory вызывается внутри VLCControl.MediaPlayer.Play(src);, поэтому путь из OpenFileDialog не имеет ничего общего с проблемой.

шаги я принял, чтобы воспроизвести/исправить:

  • Скачивали проект
  • Испытано/отлажена
    • произошло исключение, как вы описали
  • Скачивали библиотеки из VLC.DotNet хранилище
  • Изменен пути к абсолютным значениям
  • испытаны/отлажены снова
    • успешно играл музыкальный файл
    • Еще одно исключения произошедшего на закрытие (другую историю ALLtogether)

Мой каталог:

Путь решения:

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

Фактическое местонахождение Монтаж на выполнение

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

ProcessorArchitecture: x86

Библиотека Путь:

D: \ Programmierung \ Vlc.DotNet-мастер \ Vlc.DotNet-мастер \ Lib \ x86

Содержание путь к библиотеке:

плагинов (папка)

.keep (файл)

libvlc.dll (файл)

libvlccore.dll (файл)

Для тестирования я HARDCODED путь к библиотеке - вы можете сделать это, а также

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

Это очень крутой ответ. Могу ли я спросить: как вы обнаружили ошибку родного lib? Я пытался выполнить собственный проект, но он не работал и не мог даже отлаживать.Я проверю решение, как только вернусь домой и приму ответ. Привет, – JoJoeTheBear

+0

Ответ может быть немного неудовлетворительным, но это было более или менее интуитивно. Я не беспокоился ни о чем, как о родном проекте. следующие мысли: (1) Нугет делает это само по себе - означает, что нет n чтобы заботиться о чем-либо в библиотеках Vlc.DotNet. *. (2) Interop - типичное имя посредника между материалами DotNet и внешними встроенными интерфейсами. (3) различие между x86 и x64 также указывает на участие родных библиотек. (4) установив правильный путь после того, как был уверен в проблеме, был один выстрел, поэтому я не думал, что здесь много. – grek40

+0

Ну, я думаю, что не нашел бы сам. У меня теперь есть проблема, чтобы попытаться выполнить компиляцию в 64 бита, но по одной проблеме за раз. Благодарим вас за помощь. – JoJoeTheBear