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是個好的選擇。