Merge pull request #8 from vladjerca/fix/improve_os_support_and_docs

fix / improve path support and update os docs
This commit is contained in:
Vlad Jerca 2019-05-10 20:40:41 +03:00 committed by GitHub
commit f53e2a0d30
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 90 additions and 78 deletions

View file

@ -1,3 +1,3 @@
{ {
"RootDirectory": "./FFMPEG/bin" "RootDirectory": "C:\\ProgramData\\chocolatey\\lib\\ffmpeg\\tools\\ffmpeg\\bin\\"
} }

View file

@ -30,16 +30,7 @@ public FFMpeg(): base()
{ {
FFMpegHelper.RootExceptionCheck(FFMpegOptions.Options.RootDirectory); FFMpegHelper.RootExceptionCheck(FFMpegOptions.Options.RootDirectory);
var progName = "ffmpeg"; _ffmpegPath = FFMpegOptions.Options.FFmpegBinary;
if (RuntimeInformation.IsOSPlatform (OSPlatform.Windows)) {
var target = Environment.Is64BitProcess ? "x64" : "x86";
progName = $"{target}{Path.DirectorySeparatorChar}{progName}.exe";
}
var path = $"{Path.DirectorySeparatorChar}{progName}";
_ffmpegPath = $"{FFMpegOptions.Options.RootDirectory}{path}";
ArgumentBuilder = new FFArgumentBuilder(); ArgumentBuilder = new FFArgumentBuilder();
} }

View file

@ -1,5 +1,8 @@
using Newtonsoft.Json; using FFMpegCore.FFMPEG.Exceptions;
using Newtonsoft.Json;
using System;
using System.IO; using System.IO;
using System.Runtime.InteropServices;
namespace FFMpegCore.FFMPEG namespace FFMpegCore.FFMPEG
{ {
@ -24,5 +27,49 @@ static FFMpegOptions()
} }
public string RootDirectory { get; set; } = _DefaultRoot; public string RootDirectory { get; set; } = _DefaultRoot;
public string FFmpegBinary
{
get
{
var target = Environment.Is64BitProcess ? "x64" : "x86";
var progName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "ffmpeg.exe" : "ffmpeg";
if (Directory.Exists($"{Options.RootDirectory}{target}"))
{
progName = $"{target}{Path.DirectorySeparatorChar}{progName}";
}
var path = $"{Options.RootDirectory}{Path.DirectorySeparatorChar}{progName}";
if (!File.Exists(path))
throw new FFMpegException(FFMpegExceptionType.Dependency,
$"FFMpeg cannot be found @ {path}");
return path;
}
}
public string FFProbeBinary
{
get
{
var target = Environment.Is64BitProcess ? "x64" : "x86";
var progName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "ffprobe.exe" : "ffprobe";
if (Directory.Exists($"{Options.RootDirectory}{target}"))
{
progName = $"{target}{Path.DirectorySeparatorChar}{progName}";
}
var path = $"{Options.RootDirectory}{Path.DirectorySeparatorChar}{progName}";
if (!File.Exists(path))
throw new FFMpegException(FFMpegExceptionType.Dependency,
$"FFProbe cannot be found @ {path}");
return path;
}
}
} }
} }

View file

@ -16,16 +16,7 @@ public FFProbe(): base()
{ {
FFProbeHelper.RootExceptionCheck(FFMpegOptions.Options.RootDirectory); FFProbeHelper.RootExceptionCheck(FFMpegOptions.Options.RootDirectory);
var progName = "ffprobe"; _ffprobePath = FFMpegOptions.Options.FFProbeBinary;
if (RuntimeInformation.IsOSPlatform (OSPlatform.Windows)) {
var target = Environment.Is64BitProcess ? "x64" : "x86";
progName = $"{target}{Path.DirectorySeparatorChar}{progName}.exe";
}
var path = $"{Path.DirectorySeparatorChar}{progName}";
_ffprobePath = $"{FFMpegOptions.Options.RootDirectory}{path}";
} }
/// <summary> /// <summary>

Binary file not shown.

Binary file not shown.

View file

@ -127,18 +127,6 @@
<Content Include="FFMPEG\bin\presets\libx264-veryslow_firstpass.ffpreset"> <Content Include="FFMPEG\bin\presets\libx264-veryslow_firstpass.ffpreset">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Content Include="FFMPEG\bin\x64\ffmpeg.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="FFMPEG\bin\x64\ffprobe.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="FFMPEG\bin\x86\ffmpeg.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="FFMPEG\bin\x86\ffprobe.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -73,19 +73,6 @@ public static void RootExceptionCheck(string root)
if (root == null) if (root == null)
throw new FFMpegException(FFMpegExceptionType.Dependency, throw new FFMpegException(FFMpegExceptionType.Dependency,
"FFMpeg root is not configured in app config. Missing key 'ffmpegRoot'."); "FFMpeg root is not configured in app config. Missing key 'ffmpegRoot'.");
var progName = "ffmpeg";
if (RuntimeInformation.IsOSPlatform (OSPlatform.Windows)) {
var target = Environment.Is64BitProcess ? "x64" : "x86";
progName = $"{target}{Path.DirectorySeparatorChar}{progName}.exe";
}
var path = root + $"{Path.DirectorySeparatorChar}{progName}";
if (!File.Exists(path))
throw new FFMpegException(FFMpegExceptionType.Dependency,
"FFMpeg cannot be found in the root directory!");
} }
} }
} }

View file

@ -23,19 +23,7 @@ public static void RootExceptionCheck(string root)
if (root == null) if (root == null)
throw new FFMpegException(FFMpegExceptionType.Dependency, throw new FFMpegException(FFMpegExceptionType.Dependency,
"FFProbe root is not configured in app config. Missing key 'ffmpegRoot'."); "FFProbe root is not configured in app config. Missing key 'ffmpegRoot'.");
var progName = "ffprobe";
if (RuntimeInformation.IsOSPlatform (OSPlatform.Windows)) {
var target = Environment.Is64BitProcess ? "x64" : "x86";
progName = $"{target}{Path.DirectorySeparatorChar}{progName}.exe";
}
var path = root + $"{Path.DirectorySeparatorChar}{progName}";
if (!File.Exists(path))
throw new FFMpegException(FFMpegExceptionType.Dependency,
$"FFProbe cannot be found in the in {path}...");
} }
} }
} }

View file

@ -3,7 +3,7 @@
[![NuGet Badge](https://buildstats.info/nuget/FFMpegCore)](https://www.nuget.org/packages/FFMpegCore/) [![NuGet Badge](https://buildstats.info/nuget/FFMpegCore)](https://www.nuget.org/packages/FFMpegCore/)
[![Build Status](https://travis-ci.org/vladjerca/FFMpegCore.svg?branch=master)](https://travis-ci.org/vladjerca/FFMpegCore) [![Build Status](https://travis-ci.org/vladjerca/FFMpegCore.svg?branch=master)](https://travis-ci.org/vladjerca/FFMpegCore)
## Setup # Setup
#### NuGet: #### NuGet:
@ -13,19 +13,46 @@ Install-Package FFMpegCore
A great way to use FFMpeg encoding when writing video applications, client-side and server-side. It has wrapper methods that allow conversion to all web formats: MP4, OGV, TS and methods of capturing screens from the videos. A great way to use FFMpeg encoding when writing video applications, client-side and server-side. It has wrapper methods that allow conversion to all web formats: MP4, OGV, TS and methods of capturing screens from the videos.
### Configuration ## Binaries
By default the `RootDirectory` is set to `"\\FFMPEG\\bin"`. If you prefer to manually download them, visit [ffbinaries](https://ffbinaries.com/downloads).
#### Windows
command: `choco install ffmpeg -Y`
location: `C:\ProgramData\chocolatey\lib\ffmpeg\tools\ffmpeg\bin`
#### Mac OSX
command: `brew install ffmpeg mono-libgdiplus`
location: `/usr/local/bin`
#### Ubuntu
command: `sudo apt-get install -y ffmpeg libgdiplus`
location: `/usr/bin`
## Path Configuration
#### Behavior
If you are building a client app, and you don't know the processor achitecture.
By creating a folder `x64` and `x86` in the `root` directory, the lib will automatically try to use either `/root/{ARCH}/(ffmpeg|ffprobe).exe`.
If these folders are not defined, it will try to find the binaries in `/root/(ffmpeg|ffprobe.exe)`
#### Option 1 #### Option 1
The default value can be overwritten via the `FFMpegOptions` class: The default value (`\\FFMPEG\\bin`) can be overwritten via the `FFMpegOptions` class:
```c# ```c#
public Startup() public Startup()
{ {
FFMpegOptions.Configure(new FFMpegOptions { RootDirectory = "\\My_Binary\\Path" }); FFMpegOptions.Configure(new FFMpegOptions { RootDirectory = "./bin" });
} }
``` ```
@ -35,23 +62,16 @@ The root directory for the ffmpeg binaries can be configured via the `ffmpeg.con
```json ```json
{ {
"RootDirectory": ".//FFMPEG//bin" "RootDirectory": "./bin"
} }
``` ```
The files that need to be included can be found here: https://github.com/vladjerca/FFMpegCore/tree/master/FFMpegCore/FFMPEG/bin # Compatibility
Some versions of FFMPEG might not have the same argument schema. The lib has been tested with version `3.3` to `4.1`
I can only guarantee an expected behaviour built binaries included, other 3rd party builds could contain API changes rendering an unexpected behaviour. # API
MacOSX ## FFProbe
The Unit test have run on MacOSX - 10.14.4 using ffmpeg version 4.1.3. (It was installed using "brew install ffmpeg" and "brew install mono-libgdiplus"). The RootDirectory was set to "/usr/local/bin" for running unit test.
Ubuntu 16.04
The unit test failed on 2 test when running against default ffmpeg package of (ffmpeg version 2.8.15-0ubuntu0.16.04.1)
The two test that failed were Video_ToMP4_Args and Video_ToMP4_Resize_Args
The Unit test passed when running against ffmpeg version 4.1.3
### FFProbe
FFProbe is used to gather video information FFProbe is used to gather video information
```csharp ```csharp
@ -83,7 +103,7 @@ Resolution : 1280x720
Size : 2.88 Mb Size : 2.88 Mb
``` ```
### FFMpeg ## FFMpeg
Convert your video files to web ready formats: Convert your video files to web ready formats:
```csharp ```csharp