Kernel32 не найден при использовании FFmpeg.Autogen 4.1.0.2 в Mono/Linux

Я отправляю отчет об ошибке, когда публиковал это, я не знал, что смогу увидеть FFmpeg.Autogen из трассировки стека. В любом случае, я опубликовал отчет об ошибке на Github.

https://github.com/Ruslan-B/FFmpeg.AutoGen/issues/109

Я пытаюсь запустить свой код в Linux, который использует FFmpeg.Autogen для взаимодействия с библиотеками ffmpeg. Я получаю dll kernel32 не найден, не могу понять, почему. Он говорит не публиковать проблемы на github для устранения неполадок. Возможная связанная проблема: https://github.com/Ruslan-B/FFmpeg.AutoGen/issues/89

Первое, что я попробовал, это включить двоичный вспомогательный класс из примера кода, который я немного подправил. Добавлен точный путь к файлам linux. Второе, что я сделал, это добавил FFmpeg.AutoGen.dll.config, если он настроен правильно, и он пытается сослаться на Windows DLL, он должен указывать на Linux. Трассировки стека:

System.DllNotFoundException: kernel32
  at at (wrapper managed-to-native) FFmpeg.AutoGen.Native.WindowsNativeMethods.GetProcAddress(intptr,string)
  at FFmpeg.AutoGen.Native.FunctionLoader.GetFunctionPointer (System.IntPtr nativeLibraryHandle, System.String functionName) [0x00000] in D:\FFmpeg.AutoGen\FFmpeg.AutoGen\Native\FunctionLoader.cs:55
  at FFmpeg.AutoGen.Native.FunctionLoader.GetFunctionDelegate[T] (System.IntPtr nativeLibraryHandle, System.String functionName, System.Boolean throwOnError) [0x00000] in D:\FFmpeg.AutoGen\FFmpeg.AutoGen\Native\FunctionLoader.cs:28
  at FFmpeg.AutoGen.ffmpeg.GetFunctionDelegate[T] (System.IntPtr libraryHandle, System.String functionName) [0x00000] in D:\FFmpeg.AutoGen\FFmpeg.AutoGen\FFmpeg.cs:50
  at FFmpeg.AutoGen.ffmpeg+<>c.<.cctor>b__4_318 () [0x00000] in D:\FFmpeg.AutoGen\FFmpeg.AutoGen\FFmpeg.functions.export.g.cs:7163
  at FFmpeg.AutoGen.ffmpeg.avformat_alloc_context () [0x00000] in D:\FFmpeg.AutoGen\FFmpeg.AutoGen\FFmpeg.functions.export.g.cs:7176
  at FF8.FfccVaribleGroup..ctor () [0x0009c] in /home/robert/OpenVIII/FF8/FfccVaribleGroup.cs:53
  at FF8.Ffcc..ctor (System.String filename, FFmpeg.AutoGen.AVMediaType mediatype, FF8.Ffcc+FfccMode mode) [0x00008] in /home/robert/OpenVIII/FF8/Ffcc.cs:31
  at FF8.Module_movie_test.InitMovie () [0x00001] in /home/robert/OpenVIII/FF8/module_movie_test.cs:160
  at FF8.Module_movie_test.Update () [0x000c5] in /home/robert/OpenVIII/FF8/module_movie_test.cs:88
  at FF8.ModuleHandler.Update (Microsoft.Xna.Framework.GameTime gameTime) [0x000ac] in /home/robert/OpenVIII/FF8/ModuleHandler.cs:43
  at FF8.Game1.Update (Microsoft.Xna.Framework.GameTime gameTime) [0x00030] in /home/robert/OpenVIII/FF8/Game1.cs:69
  at Microsoft.Xna.Framework.Game.DoUpdate (Microsoft.Xna.Framework.GameTime gameTime) [0x00019] in <4fc8466c27384bb19c7b81b2a6a71083>:0
  at Microsoft.Xna.Framework.Game.Tick () [0x00103] in <4fc8466c27384bb19c7b81b2a6a71083>:0
  at Microsoft.Xna.Framework.SdlGamePlatform.RunLoop () [0x00021] in <4fc8466c27384bb19c7b81b2a6a71083>:0
  at Microsoft.Xna.Framework.Game.Run (Microsoft.Xna.Framework.GameRunBehavior runBehavior) [0x0008b] in <4fc8466c27384bb19c7b81b2a6a71083>:0
  at Microsoft.Xna.Framework.Game.Run () [0x0000c] in <4fc8466c27384bb19c7b81b2a6a71083>:0
  at FF8.Program.Main () [0x00007] in /home/robert/OpenVIII/FF8/Program.cs:17

Мой код, который запускает это:

Format = ffmpeg.avformat_alloc_context();

Binaryhelper должен правильно указать путь к файлу

internal static void RegisterFFmpegBinaries()
        {
            var libraryPath = "";
            switch (Environment.OSVersion.Platform)
            {
                case PlatformID.Win32NT:
                case PlatformID.Win32S:
                case PlatformID.Win32Windows:
                    var current = Environment.CurrentDirectory;
                    var probe = Path.Combine(Environment.Is64BitProcess ? "x64" : "x86");
                    while (current != null)
                    {
                        var ffmpegDirectory = Path.Combine(current, probe);
                        if (Directory.Exists(ffmpegDirectory))
                        {
                            Console.WriteLine($"FFmpeg binaries found in: {ffmpegDirectory}");
                            RegisterLibrariesSearchPath(ffmpegDirectory);
                            return;
                        }
                        current = Directory.GetParent(current)?.FullName;
                    }
                    break;
                case PlatformID.Unix:
                    libraryPath = "/usr/lib/x86_64-linux-gnu";
                    RegisterLibrariesSearchPath(libraryPath);
                    break;
                case PlatformID.MacOSX:
                    libraryPath = Environment.GetEnvironmentVariable(LD_LIBRARY_PATH);
                    RegisterLibrariesSearchPath(libraryPath);
                    break;
            }
        }

FFmpeg.Autogen.dll.config

<configuration>
  <dllmap os = "linux" dll = "avutil-56.dll" target = "/usr/lib/x86_64-linux-gnu/libavutil.so.56"/>
  <dllmap os = "linux" dll = "avcodec-58.dll" target = "/usr/lib/x86_64-linux-gnu/libavcodec.so.58"/>
  <dllmap os = "linux" dll = "avformat-58.dll" target = "/usr/lib/x86_64-linux-gnu/libavformat.so.58"/>
  <dllmap os = "linux" dll = "avdevice-58.dll" target = "/usr/lib/x86_64-linux-gnu/libavdevice.so.58"/>
  <dllmap os = "linux" dll = "avfilter-7.dll" target = "/usr/lib/x86_64-linux-gnu/libavfilter.so.7"/>
  <dllmap os = "linux" dll = "avresample-4.dll" target = "/usr/lib/x86_64-linux-gnu/libavresample.so.4"/>
  <dllmap os = "linux" dll = "swscale-5.dll" target = "/usr/lib/x86_64-linux-gnu/libswscale.so.5"/>
  <dllmap os = "linux" dll = "swresample-3.dll" target = "/usr/lib/x86_64-linux-gnu/libswresample.so.3"/>
  <dllmap os = "linux" dll = "postproc-55.dll" target = "/usr/lib/x86_64-linux-gnu/libpostproc.so.55"/>
</configuration>

Ясно, что код С# пытается напрямую P/вызвать GetProcAddress, который является методом WinAPI, требующим kernel32.dll - Windows DLL...

user2819245 28.03.2019 20:03

Я уже вижу кое-что, чего не замечал до сих пор, это срабатывает при отключении GetProcAddress Возможно, это отчет об ошибке. Так что это даже не та часть, которая пытается загрузить библиотеки?

Robert Russell 28.03.2019 20:04

Да, это не та часть, которая пытается загрузить библиотеки. Кажется, FFmpeg.Autogen имеет некоторые жестко запрограммированные зависимости от WinAPI. Лучше всего проверить средство отслеживания проблем для FFmpeg.Autogen, если о проблеме уже сообщалось, а если нет, лучше написать новый отчет о проблеме с отсутствием совместимости с системами, отличными от Windows.

user2819245 28.03.2019 20:06

Возможно, существует нейтральная к платформе версия FFmpeg.Autogen (другими словами, стандартный порт/сборка .NET)? Я не знаю. Согласно главной странице FFmpeg.Autogen на github, он должен работать в Linux. Возможно, вы используете старую, устаревшую версию, которая может быть несовместима с Linux?

user2819245 28.03.2019 20:07

Я думаю, что это проблема NET45, которая сломала вещи в NET2, у него есть случай переключения, выбирающий, какую функцию использовать. в NET45 у него это было только с помощью функции Windows.

Robert Russell 28.03.2019 20:11

Ну, я только что отредактировал исходный код FFmpeg.Autogen и скомпилировал его, и исключение исчезло. хотя это еще не "работает" Может быть, есть еще небольшие проблемы Спасибо за помощь.

Robert Russell 28.03.2019 20:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
541
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

https://github.com/Ruslan-B/FFmpeg.AutoGen/issues/109#issuecomment-477756443

Руслан-Б сказал, что починит.

После применения исправления оно в основном работает. Я полагаю, что не вижу видео только потому, что цветовое пространство, которое я использую, неверно для Linux, это мое предположение. Аудио работает нормально.

Но этот вопрос закрыт.

Элгонзо в комментариях помог указать, что правильная проблема заключается не в том, что библиотеки не загружаются. И дело в том, что FFmpeg.Autogen использует неправильную функцию только для Windows.

Я понял, почему он не рисовал видео в вопросе ниже. Так что теперь все работает. Исправление было применено к FFmpeg.Autogen. stackoverflow.com/questions/55437187/…

Robert Russell 15.04.2019 11:53

Другие вопросы по теме