|
|
|
@ -83,8 +83,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
_jsonSerializerOptions = JsonDefaults.GetOptions();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private EncodingHelper EncodingHelper => _encodingHelperFactory.Value;
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public string EncoderPath => _ffmpegPath;
|
|
|
|
|
|
|
|
|
@ -319,33 +317,24 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
public Task<MediaInfo> GetMediaInfo(MediaInfoRequest request, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var extractChapters = request.MediaType == DlnaProfileType.Video && request.ExtractChapters;
|
|
|
|
|
var inputFile = request.MediaSource.Path;
|
|
|
|
|
|
|
|
|
|
var inputFiles = MediaEncoderHelpers.GetInputArgument(_fileSystem, request.MediaSource.Path, request.PlayableStreamFileNames);
|
|
|
|
|
|
|
|
|
|
var probeSize = EncodingHelper.GetProbeSizeArgument(inputFiles.Length);
|
|
|
|
|
string analyzeDuration;
|
|
|
|
|
string analyzeDuration = string.Empty;
|
|
|
|
|
|
|
|
|
|
if (request.MediaSource.AnalyzeDurationMs > 0)
|
|
|
|
|
{
|
|
|
|
|
analyzeDuration = "-analyzeduration " +
|
|
|
|
|
(request.MediaSource.AnalyzeDurationMs * 1000).ToString();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
analyzeDuration = EncodingHelper.GetAnalyzeDurationArgument(inputFiles.Length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
probeSize = probeSize + " " + analyzeDuration;
|
|
|
|
|
probeSize = probeSize.Trim();
|
|
|
|
|
|
|
|
|
|
var forceEnableLogging = request.MediaSource.Protocol != MediaProtocol.File;
|
|
|
|
|
|
|
|
|
|
return GetMediaInfoInternal(
|
|
|
|
|
GetInputArgument(inputFiles, request.MediaSource),
|
|
|
|
|
GetInputArgument(inputFile, request.MediaSource),
|
|
|
|
|
request.MediaSource.Path,
|
|
|
|
|
request.MediaSource.Protocol,
|
|
|
|
|
extractChapters,
|
|
|
|
|
probeSize,
|
|
|
|
|
analyzeDuration,
|
|
|
|
|
request.MediaType == DlnaProfileType.Audio,
|
|
|
|
|
request.MediaSource.VideoType,
|
|
|
|
|
forceEnableLogging,
|
|
|
|
@ -355,11 +344,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the input argument.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="inputFiles">The input files.</param>
|
|
|
|
|
/// <param name="inputFile">The input file.</param>
|
|
|
|
|
/// <param name="mediaSource">The mediaSource.</param>
|
|
|
|
|
/// <returns>System.String.</returns>
|
|
|
|
|
/// <exception cref="ArgumentException">Unrecognized InputType.</exception>
|
|
|
|
|
public string GetInputArgument(IReadOnlyList<string> inputFiles, MediaSourceInfo mediaSource)
|
|
|
|
|
public string GetInputArgument(string inputFile, MediaSourceInfo mediaSource)
|
|
|
|
|
{
|
|
|
|
|
var prefix = "file";
|
|
|
|
|
if (mediaSource.VideoType == VideoType.BluRay || mediaSource.VideoType == VideoType.Iso)
|
|
|
|
@ -367,7 +356,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
prefix = "bluray";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return EncodingUtils.GetInputArgument(prefix, inputFiles, mediaSource.Protocol);
|
|
|
|
|
return EncodingUtils.GetInputArgument(prefix, inputFile, mediaSource.Protocol);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -471,21 +460,21 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
Protocol = MediaProtocol.File
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return ExtractImage(new[] { path }, null, null, imageStreamIndex, mediaSource, true, null, null, cancellationToken);
|
|
|
|
|
return ExtractImage(path, null, null, imageStreamIndex, mediaSource, true, null, null, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task<string> ExtractVideoImage(string[] inputFiles, string container, MediaSourceInfo mediaSource, MediaStream videoStream, Video3DFormat? threedFormat, TimeSpan? offset, CancellationToken cancellationToken)
|
|
|
|
|
public Task<string> ExtractVideoImage(string inputFile, string container, MediaSourceInfo mediaSource, MediaStream videoStream, Video3DFormat? threedFormat, TimeSpan? offset, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
return ExtractImage(inputFiles, container, videoStream, null, mediaSource, false, threedFormat, offset, cancellationToken);
|
|
|
|
|
return ExtractImage(inputFile, container, videoStream, null, mediaSource, false, threedFormat, offset, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task<string> ExtractVideoImage(string[] inputFiles, string container, MediaSourceInfo mediaSource, MediaStream imageStream, int? imageStreamIndex, CancellationToken cancellationToken)
|
|
|
|
|
public Task<string> ExtractVideoImage(string inputFile, string container, MediaSourceInfo mediaSource, MediaStream imageStream, int? imageStreamIndex, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
return ExtractImage(inputFiles, container, imageStream, imageStreamIndex, mediaSource, false, null, null, cancellationToken);
|
|
|
|
|
return ExtractImage(inputFile, container, imageStream, imageStreamIndex, mediaSource, false, null, null, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<string> ExtractImage(
|
|
|
|
|
string[] inputFiles,
|
|
|
|
|
string inputFile,
|
|
|
|
|
string container,
|
|
|
|
|
MediaStream videoStream,
|
|
|
|
|
int? imageStreamIndex,
|
|
|
|
@ -495,7 +484,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
TimeSpan? offset,
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var inputArgument = GetInputArgument(inputFiles, mediaSource);
|
|
|
|
|
var inputArgument = GetInputArgument(inputFile, mediaSource);
|
|
|
|
|
|
|
|
|
|
if (isAudio)
|
|
|
|
|
{
|
|
|
|
@ -572,8 +561,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
var args = useIFrame ? string.Format(CultureInfo.InvariantCulture, "-i {0}{3} -threads 0 -v quiet -vframes 1 -vf \"{2}{4}\" -f image2 \"{1}\"", inputPath, tempExtractPath, vf, mapArg, thumbnail) :
|
|
|
|
|
string.Format(CultureInfo.InvariantCulture, "-i {0}{3} -threads 0 -v quiet -vframes 1 -vf \"{2}\" -f image2 \"{1}\"", inputPath, tempExtractPath, vf, mapArg);
|
|
|
|
|
|
|
|
|
|
var probeSizeArgument = EncodingHelper.GetProbeSizeArgument(1);
|
|
|
|
|
var analyzeDurationArgument = EncodingHelper.GetAnalyzeDurationArgument(1);
|
|
|
|
|
var probeSizeArgument = string.Empty;
|
|
|
|
|
var analyzeDurationArgument = string.Empty;
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(probeSizeArgument))
|
|
|
|
|
{
|
|
|
|
@ -682,7 +671,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task ExtractVideoImagesOnInterval(
|
|
|
|
|
string[] inputFiles,
|
|
|
|
|
string inputFile,
|
|
|
|
|
string container,
|
|
|
|
|
MediaStream videoStream,
|
|
|
|
|
MediaSourceInfo mediaSource,
|
|
|
|
@ -693,7 +682,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
int? maxWidth,
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var inputArgument = GetInputArgument(inputFiles, mediaSource);
|
|
|
|
|
var inputArgument = GetInputArgument(inputFile, mediaSource);
|
|
|
|
|
|
|
|
|
|
var vf = "fps=fps=1/" + interval.TotalSeconds.ToString(_usCulture);
|
|
|
|
|
|
|
|
|
@ -709,8 +698,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|
|
|
|
|
|
|
|
|
var args = string.Format(CultureInfo.InvariantCulture, "-i {0} -threads 0 -v quiet -vf \"{2}\" -f image2 \"{1}\"", inputArgument, outputPath, vf);
|
|
|
|
|
|
|
|
|
|
var probeSizeArgument = EncodingHelper.GetProbeSizeArgument(1);
|
|
|
|
|
var analyzeDurationArgument = EncodingHelper.GetAnalyzeDurationArgument(1);
|
|
|
|
|
var probeSizeArgument = string.Empty;
|
|
|
|
|
var analyzeDurationArgument = string.Empty;
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(probeSizeArgument))
|
|
|
|
|
{
|
|
|
|
|