在Mono / Linux中使用FFmpeg.Autogen 4.1.0.2时找不到Kernel32 https://github.com/Ruslan-B/FFmpeg.AutoGen/issues
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Mono / Linux中使用FFmpeg.Autogen 4.1.0.2时找不到Kernel32 https://github.com/Ruslan-B/FFmpeg.AutoGen/issues相关的知识,希望对你有一定的参考价值。
我在发帖时提交错误报告我不知道我可以从堆栈跟踪中看到FFmpeg.Autogen。无论如何,我在Github上发布了一个Bug报告
https://github.com/Ruslan-B/FFmpeg.AutoGen/issues/109
我正在尝试在Linux中运行我的代码,该代码使用FFmpeg.Autogen与ffmpeg库进行交互。我得到的kernel32 dll未找到无法弄清楚原因。他说不要向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.AutoGenFFmpeg.AutoGenNativeFunctionLoader.cs:55
at FFmpeg.AutoGen.Native.FunctionLoader.GetFunctionDelegate[T] (System.IntPtr nativeLibraryHandle, System.String functionName, System.Boolean throwOnError) [0x00000] in D:FFmpeg.AutoGenFFmpeg.AutoGenNativeFunctionLoader.cs:28
at FFmpeg.AutoGen.ffmpeg.GetFunctionDelegate[T] (System.IntPtr libraryHandle, System.String functionName) [0x00000] in D:FFmpeg.AutoGenFFmpeg.AutoGenFFmpeg.cs:50
at FFmpeg.AutoGen.ffmpeg+<>c.<.cctor>b__4_318 () [0x00000] in D:FFmpeg.AutoGenFFmpeg.AutoGenFFmpeg.functions.export.g.cs:7163
at FFmpeg.AutoGen.ffmpeg.avformat_alloc_context () [0x00000] in D:FFmpeg.AutoGenFFmpeg.AutoGenFFmpeg.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>
https://github.com/Ruslan-B/FFmpeg.AutoGen/issues/109#issuecomment-477756443
Ruslan-B说他会修复它。
应用修复后,它主要工作,我认为我只是没有看到视频,因为我使用的颜色空间对于Linux是错误的,这是我的猜测。音频工作正常。
但是这个问题已经结束了。
评论中的Elgonzo帮助指出正确的问题不是库无法加载。而且FFmpeg.Autogen正在使用错误的仅限Windows功能。
以上是关于在Mono / Linux中使用FFmpeg.Autogen 4.1.0.2时找不到Kernel32 https://github.com/Ruslan-B/FFmpeg.AutoGen/issues的主要内容,如果未能解决你的问题,请参考以下文章
在 Linux 中的 Mono 下,在 Visual Studio / msbuild 中编译的二进制文件是不是 100% 兼容?