Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 39 additions & 8 deletions FFMpegCore/FFProbe/FFProbe.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,19 @@ namespace FFMpegCore;
public static class FFProbe
{
public static IMediaAnalysis Analyse(string filePath, FFOptions? ffOptions = null, string? customArguments = null)
{
return new MediaAnalysis(GetAnalysis(filePath, ffOptions, customArguments));
}

public static FFProbeAnalysis GetAnalysis(string filePath, FFOptions? ffOptions = null, string? customArguments = null)
{
ThrowIfInputFileDoesNotExist(filePath);

var processArguments = PrepareStreamAnalysisInstance(filePath, ffOptions ?? GlobalFFOptions.Current, customArguments);
var result = processArguments.StartAndWaitForExit();
ThrowIfExitCodeNotZero(result);

return ParseOutput(result);
return DeserializeOutput(result);
}

public static FFProbeFrames GetFrames(string filePath, FFOptions? ffOptions = null, string? customArguments = null)
Expand All @@ -45,15 +50,25 @@ public static FFProbePackets GetPackets(string filePath, FFOptions? ffOptions =
}

public static IMediaAnalysis Analyse(Uri uri, FFOptions? ffOptions = null, string? customArguments = null)
{
return new MediaAnalysis(GetAnalysis(uri, ffOptions, customArguments));
}

public static FFProbeAnalysis GetAnalysis(Uri uri, FFOptions? ffOptions = null, string? customArguments = null)
{
var instance = PrepareStreamAnalysisInstance(uri.AbsoluteUri, ffOptions ?? GlobalFFOptions.Current, customArguments);
var result = instance.StartAndWaitForExit();
ThrowIfExitCodeNotZero(result);

return ParseOutput(result);
return DeserializeOutput(result);
}

public static IMediaAnalysis Analyse(Stream stream, FFOptions? ffOptions = null, string? customArguments = null)
{
return new MediaAnalysis(GetAnalysis(stream, ffOptions, customArguments));
}

public static FFProbeAnalysis GetAnalysis(Stream stream, FFOptions? ffOptions = null, string? customArguments = null)
{
var streamPipeSource = new StreamPipeSource(stream);
var pipeArgument = new InputPipeArgument(streamPipeSource);
Expand All @@ -74,19 +89,25 @@ public static IMediaAnalysis Analyse(Stream stream, FFOptions? ffOptions = null,
var result = task.ConfigureAwait(false).GetAwaiter().GetResult();
ThrowIfExitCodeNotZero(result);

return ParseOutput(result);
return DeserializeOutput(result);
}

public static async Task<IMediaAnalysis> AnalyseAsync(string filePath, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null)
{
return new MediaAnalysis(await GetAnalysisAsync(filePath, ffOptions, cancellationToken, customArguments));
}

public static async Task<FFProbeAnalysis> GetAnalysisAsync(string filePath, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null)
{
ThrowIfInputFileDoesNotExist(filePath);

var instance = PrepareStreamAnalysisInstance(filePath, ffOptions ?? GlobalFFOptions.Current, customArguments);
var result = await instance.StartAndWaitForExitAsync(cancellationToken).ConfigureAwait(false);
ThrowIfExitCodeNotZero(result);

return ParseOutput(result);
return DeserializeOutput(result);
}

public static FFProbeFrames GetFrames(Uri uri, FFOptions? ffOptions = null, string? customArguments = null)
Expand Down Expand Up @@ -120,16 +141,26 @@ public static async Task<FFProbePackets> GetPacketsAsync(string filePath, FFOpti

public static async Task<IMediaAnalysis> AnalyseAsync(Uri uri, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null)
{
return new MediaAnalysis(await GetAnalysisAsync(uri, ffOptions, cancellationToken, customArguments));
}
public static async Task<FFProbeAnalysis> GetAnalysisAsync(Uri uri, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null)
{
var instance = PrepareStreamAnalysisInstance(uri.AbsoluteUri, ffOptions ?? GlobalFFOptions.Current, customArguments);
var result = await instance.StartAndWaitForExitAsync(cancellationToken).ConfigureAwait(false);
ThrowIfExitCodeNotZero(result);

return ParseOutput(result);
return DeserializeOutput(result);
}

public static async Task<IMediaAnalysis> AnalyseAsync(Stream stream, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null)
{
return new MediaAnalysis(await GetAnalysisAsync(stream, ffOptions, cancellationToken, customArguments));
}
public static async Task<FFProbeAnalysis> GetAnalysisAsync(Stream stream, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null)
{
var streamPipeSource = new StreamPipeSource(stream);
var pipeArgument = new InputPipeArgument(streamPipeSource);
Expand All @@ -153,7 +184,7 @@ public static async Task<IMediaAnalysis> AnalyseAsync(Stream stream, FFOptions?
ThrowIfExitCodeNotZero(result);

pipeArgument.Post();
return ParseOutput(result);
return DeserializeOutput(result);
}

public static async Task<FFProbeFrames> GetFramesAsync(Uri uri, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
Expand All @@ -164,7 +195,7 @@ public static async Task<FFProbeFrames> GetFramesAsync(Uri uri, FFOptions? ffOpt
return ParseFramesOutput(result);
}

private static IMediaAnalysis ParseOutput(IProcessResult instance)
private static FFProbeAnalysis DeserializeOutput(IProcessResult instance)
{
var json = string.Join(string.Empty, instance.OutputData);
var ffprobeAnalysis = JsonSerializer.Deserialize<FFProbeAnalysis>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
Expand All @@ -175,7 +206,7 @@ private static IMediaAnalysis ParseOutput(IProcessResult instance)
}

ffprobeAnalysis.ErrorData = instance.ErrorData;
return new MediaAnalysis(ffprobeAnalysis);
return ffprobeAnalysis;
}

private static FFProbeFrames ParseFramesOutput(IProcessResult instance)
Expand Down
2 changes: 1 addition & 1 deletion FFMpegCore/FFProbe/FFProbeAnalysis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class FFProbeAnalysis

[JsonPropertyName("chapters")] public List<Chapter> Chapters { get; set; } = null!;

[JsonIgnore] public IReadOnlyList<string> ErrorData { get; set; } = new List<string>();
public IReadOnlyList<string> ErrorData { get; set; } = new List<string>();
}

public class FFProbeStream : ITagsContainer, IDispositionContainer
Expand Down
4 changes: 2 additions & 2 deletions FFMpegCore/FFProbe/MediaAnalysis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

namespace FFMpegCore;

internal class MediaAnalysis : IMediaAnalysis
public class MediaAnalysis : IMediaAnalysis
{
internal MediaAnalysis(FFProbeAnalysis analysis)
public MediaAnalysis(FFProbeAnalysis analysis)
{
Format = ParseFormat(analysis.Format);
Chapters = analysis.Chapters.Select(c => ParseChapter(c)).ToList();
Expand Down