Я отправляю отчет об ошибке, когда публиковал это, я не знал, что смогу увидеть FFmpeg.Autogen из трассировки стека. В любом случае, я опубликовал отчет об ошибке на Github.
Я пытаюсь запустить свой код в 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>
Я уже вижу кое-что, чего не замечал до сих пор, это срабатывает при отключении GetProcAddress Возможно, это отчет об ошибке. Так что это даже не та часть, которая пытается загрузить библиотеки?
Да, это не та часть, которая пытается загрузить библиотеки. Кажется, FFmpeg.Autogen имеет некоторые жестко запрограммированные зависимости от WinAPI. Лучше всего проверить средство отслеживания проблем для FFmpeg.Autogen, если о проблеме уже сообщалось, а если нет, лучше написать новый отчет о проблеме с отсутствием совместимости с системами, отличными от Windows.
Возможно, существует нейтральная к платформе версия FFmpeg.Autogen (другими словами, стандартный порт/сборка .NET)? Я не знаю. Согласно главной странице FFmpeg.Autogen на github, он должен работать в Linux. Возможно, вы используете старую, устаревшую версию, которая может быть несовместима с Linux?
Я думаю, что это проблема NET45, которая сломала вещи в NET2, у него есть случай переключения, выбирающий, какую функцию использовать. в NET45 у него это было только с помощью функции Windows.
Ну, я только что отредактировал исходный код FFmpeg.Autogen и скомпилировал его, и исключение исчезло. хотя это еще не "работает" Может быть, есть еще небольшие проблемы Спасибо за помощь.





https://github.com/Ruslan-B/FFmpeg.AutoGen/issues/109#issuecomment-477756443
Руслан-Б сказал, что починит.
После применения исправления оно в основном работает. Я полагаю, что не вижу видео только потому, что цветовое пространство, которое я использую, неверно для Linux, это мое предположение. Аудио работает нормально.
Но этот вопрос закрыт.
Элгонзо в комментариях помог указать, что правильная проблема заключается не в том, что библиотеки не загружаются. И дело в том, что FFmpeg.Autogen использует неправильную функцию только для Windows.
Я понял, почему он не рисовал видео в вопросе ниже. Так что теперь все работает. Исправление было применено к FFmpeg.Autogen. stackoverflow.com/questions/55437187/…
Ясно, что код С# пытается напрямую P/вызвать GetProcAddress, который является методом WinAPI, требующим kernel32.dll - Windows DLL...