extracted a media encoding interface to keep ffmpeg out of nuget packages

This commit is contained in:
Luke Pulverenti
2013-04-07 16:55:05 -04:00
parent d14c3b31ff
commit cb39f8e7b5
37 changed files with 1430 additions and 1179 deletions

View File

@@ -1,8 +1,10 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.MediaInfo;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers.MediaInfo;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
@@ -46,6 +48,12 @@ namespace MediaBrowser.Api.Playback
/// <value>The iso manager.</value>
protected IIsoManager IsoManager { get; set; }
/// <summary>
/// Gets or sets the media encoder.
/// </summary>
/// <value>The media encoder.</value>
protected IMediaEncoder MediaEncoder { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="BaseStreamingService" /> class.
/// </summary>
@@ -53,12 +61,14 @@ namespace MediaBrowser.Api.Playback
/// <param name="userManager">The user manager.</param>
/// <param name="libraryManager">The library manager.</param>
/// <param name="isoManager">The iso manager.</param>
protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager)
/// <param name="mediaEncoder">The media encoder.</param>
protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder)
{
ApplicationPaths = appPaths;
UserManager = userManager;
LibraryManager = libraryManager;
IsoManager = isoManager;
MediaEncoder = mediaEncoder;
}
/// <summary>
@@ -309,9 +319,17 @@ namespace MediaBrowser.Api.Playback
if (!File.Exists(path))
{
var success = Kernel.Instance.FFMpegManager.ExtractTextSubtitle(video, subtitleStream.Index, path, CancellationToken.None).Result;
InputType type;
if (!success)
var inputPath = MediaEncoderHelpers.GetInputArgument(video, null, out type);
try
{
var task = MediaEncoder.ExtractTextSubtitle(inputPath, type, subtitleStream.Index, path, CancellationToken.None);
Task.WaitAll(task);
}
catch
{
return null;
}
@@ -332,9 +350,13 @@ namespace MediaBrowser.Api.Playback
if (!File.Exists(path))
{
var success = Kernel.Instance.FFMpegManager.ConvertTextSubtitle(subtitleStream, path, CancellationToken.None).Result;
try
{
var task = MediaEncoder.ConvertTextSubtitleToAss(subtitleStream.Path, path, CancellationToken.None);
if (!success)
Task.WaitAll(task);
}
catch
{
return null;
}
@@ -365,6 +387,16 @@ namespace MediaBrowser.Api.Playback
return string.Format(" -filter_complex \"[0:{0}]format=yuva444p,lut=u=128:v=128:y=gammaval(.3)[sub] ; [0:{1}] [sub] overlay{2}\"", state.SubtitleStream.Index, state.VideoStream.Index, outputSizeParam);
}
/// <summary>
/// Gets the probe size argument.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>System.String.</returns>
protected string GetProbeSizeArgument(BaseItem item)
{
return MediaEncoder.GetProbeSizeArgument(MediaEncoderHelpers.GetInputType(item));
}
/// <summary>
/// Gets the number of audio channels to specify on the command line
/// </summary>
@@ -477,9 +509,18 @@ namespace MediaBrowser.Api.Playback
/// <returns>System.String.</returns>
protected string GetInputArgument(BaseItem item, IIsoMount isoMount)
{
return isoMount == null ?
Kernel.Instance.FFMpegManager.GetInputArgument(item) :
Kernel.Instance.FFMpegManager.GetInputArgument(item as Video, isoMount);
var type = InputType.AudioFile;
var inputPath = new[] { item.Path };
var video = item as Video;
if (video != null)
{
inputPath = MediaEncoderHelpers.GetInputArgument(video, isoMount, out type);
}
return MediaEncoder.GetInputArgument(inputPath, type);
}
/// <summary>
@@ -508,8 +549,8 @@ namespace MediaBrowser.Api.Playback
RedirectStandardOutput = true,
RedirectStandardError = true,
FileName = Kernel.Instance.FFMpegManager.FFMpegPath,
WorkingDirectory = Path.GetDirectoryName(Kernel.Instance.FFMpegManager.FFMpegPath),
FileName = MediaEncoder.EncoderPath,
WorkingDirectory = Path.GetDirectoryName(MediaEncoder.EncoderPath),
Arguments = GetCommandLineArguments(outputPath, state),
WindowStyle = ProcessWindowStyle.Hidden,
@@ -655,7 +696,7 @@ namespace MediaBrowser.Api.Playback
}
state.AudioStream = GetMediaStream(media.MediaStreams, null, MediaStreamType.Audio, true);
return state;
}