在.NET中是否有一组用于FFMpeg,libavutil,libavformat和libavcodec的工作P/Invoke声明?

cas*_*One 8 .net ffmpeg libavcodec libavformat

我目前正在寻求从.NET访问libavutil,libavformat和libavcodec(FFMpeg的所有部分).

目前,我正在 Windows 32位每晚执行的共享FFMpeg程序包的自动构建中获取.

我也在使用ffmpeg-sharp项目中的代码.在该项目中,我删除了许多未编译的类(它们是包装类而不是P/Invoke声明).

代码编译得很好,但我遇到了一些问题.

首先,似乎av*.dll的构建使用cdecl调用约定,因为我PInvokeStackImbalanceException在尝试调用时收到了一些av_open_input_file.这很容易改变以使其正常工作.该AVFormatContext结构已填充.

之后,我想调用av_find_stream_info以获取有关文件中的流的信息.但是,当从调用中AVFormatContext检索到调用时av_open_input_file,AccessViolationException会抛出一个指示我正在尝试从受保护的内存中读取或写入的内容.

有没有人使用P/Invoke通过P/Invoke访问libavutil,libavformat和libavcodec dll库并使其工作?

我应该提到使用FFMpeg的命令行版本,虽然解决方案在这种情况下不是可行的解决方案,但是需要通过库进行访问.这样做的原因是我不得不把磁盘方式过多地做我需要做的事情(我必须对一些非常高清晰度的视频进行逐帧分析)并且我想避免磁盘越多越好.

cas*_*One 2

这就是我的结论 - 即 ffmpeg-sharp 项目中的大量 P/Invoke 声明是不正确的。他们在声明中的很多地方使用了被封送回来的结构,但随后必须将其传递给释放例程。

因为指针在封送过程中已丢失,所以AccessViolationException当尝试将该结构传递给接受有效指针(如 Windows 中的句柄)的其他方法时,这就是导致抛出 的原因。它们并没有将它们视为不透明(正如 Windows API 所做的那样),而是将结构封送回来并在此过程中丢失指针。

解决方案是更改其 API 声明以获取/返回IntPtr并根据需要执行结构的封送处理,而不是将它们包含在 P/Invoke 声明中。