FFmpeg是用C开发的,若是C#要用,能够调用FFmpeg的dll, 可是这样比较复杂,FFmpeg的sdk有不少函数,C#调用C还涉及到数据类型转换,难度很大,不过FFmpeg有C#版本FFmpeg.AutoGen,在项目中能够直接导入使用。git
FFmpeg.AutoGen 项目源码 https://github.com/Ruslan-B/FFmpeg.AutoGengithub
该项目用VS2017能够直接编译,解决方案以下图:数据结构
FFmpeg.AutoGen编译时可能会报以下错误:函数
error NETSDK1045: 当前 .NET SDK 不支持将 .NET Standard 2.1 设置为目标。请将 .NET Standard 2.0 或更低版本设置为目标,或使用支持 .NET Standard 2.1 的 .NET SDK 版本。this
此时须要修改项目文件,右键FFmpeg.AutoGen, 点击【编辑FFmepg.AutoGen.vsproj】,根据相应的错误进行修改,例如个人修改以下:code
<Project Sdk="Microsoft.NET.Sdk">orm
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net45;net40</TargetFrameworks>
<PackageId>FFmpeg.AutoGen</PackageId>
blog。。。开发
。。。get
再次编译就ok了。
查看项目属性可知,FFmpeg.AutoGen是dll项目,其它两个是应用程序。
该项目就是把FFmpeg dll以C#的形式作了一次封装,把FFmpeg的相关数据结构,类型,宏等都作了转换,以便在C#项目中使用。例如FFmpeg.AutoGen项目的FFmpeg.functions.export.g.cs 该文件封装了FFmpeg的大部分API,该文件写了一个静态类ffmpeg, 项目调用时,能够直接调用它的成员方法,好比av_register_all()方法的封装:
C#代码:
public static void av_register_all() { av_register_all_fptr(); }
av_register_all_fptr()代码:
private static av_register_all_delegate av_register_all_fptr = () => { av_register_all_fptr = GetFunctionDelegate<av_register_all_delegate>(GetOrLoadLibrary("avformat"), "av_register_all"); if (av_register_all_fptr == null) { av_register_all_fptr = delegate { throw new PlatformNotSupportedException("av_register_all is not supported on this platform."); }; } av_register_all_fptr(); };
从以上代码能够看出,这是直接从ffmpeg的avformat.dll直接导出API.
若是想用C# FFmpeg开发项目,FFmpeg.AutoGen是个好的选择。