This commit is contained in:
tqk2811 2025-10-27 21:27:18 +01:00 committed by GitHub
commit f2000508cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 42 additions and 11 deletions

View file

@ -12,6 +12,11 @@ namespace FFMpegCore;
public static class FFProbe public static class FFProbe
{ {
public static IMediaAnalysis Analyse(string filePath, FFOptions? ffOptions = null, string? customArguments = null) 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); ThrowIfInputFileDoesNotExist(filePath);
@ -19,7 +24,7 @@ public static class FFProbe
var result = processArguments.StartAndWaitForExit(); var result = processArguments.StartAndWaitForExit();
ThrowIfExitCodeNotZero(result); ThrowIfExitCodeNotZero(result);
return ParseOutput(result); return DeserializeOutput(result);
} }
public static FFProbeFrames GetFrames(string filePath, FFOptions? ffOptions = null, string? customArguments = null) public static FFProbeFrames GetFrames(string filePath, FFOptions? ffOptions = null, string? customArguments = null)
@ -45,15 +50,25 @@ public static class FFProbe
} }
public static IMediaAnalysis Analyse(Uri uri, FFOptions? ffOptions = null, string? customArguments = null) 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 instance = PrepareStreamAnalysisInstance(uri.AbsoluteUri, ffOptions ?? GlobalFFOptions.Current, customArguments);
var result = instance.StartAndWaitForExit(); var result = instance.StartAndWaitForExit();
ThrowIfExitCodeNotZero(result); ThrowIfExitCodeNotZero(result);
return ParseOutput(result); return DeserializeOutput(result);
} }
public static IMediaAnalysis Analyse(Stream stream, FFOptions? ffOptions = null, string? customArguments = null) 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 streamPipeSource = new StreamPipeSource(stream);
var pipeArgument = new InputPipeArgument(streamPipeSource); var pipeArgument = new InputPipeArgument(streamPipeSource);
@ -74,11 +89,17 @@ public static class FFProbe
var result = task.ConfigureAwait(false).GetAwaiter().GetResult(); var result = task.ConfigureAwait(false).GetAwaiter().GetResult();
ThrowIfExitCodeNotZero(result); ThrowIfExitCodeNotZero(result);
return ParseOutput(result); return DeserializeOutput(result);
} }
public static async Task<IMediaAnalysis> AnalyseAsync(string filePath, FFOptions? ffOptions = null, CancellationToken cancellationToken = default, public static async Task<IMediaAnalysis> AnalyseAsync(string filePath, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null) 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); ThrowIfInputFileDoesNotExist(filePath);
@ -87,7 +108,7 @@ public static class FFProbe
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
ThrowIfExitCodeNotZero(result); ThrowIfExitCodeNotZero(result);
return ParseOutput(result); return DeserializeOutput(result);
} }
public static FFProbeFrames GetFrames(Uri uri, FFOptions? ffOptions = null, string? customArguments = null) public static FFProbeFrames GetFrames(Uri uri, FFOptions? ffOptions = null, string? customArguments = null)
@ -121,17 +142,27 @@ public static class FFProbe
public static async Task<IMediaAnalysis> AnalyseAsync(Uri uri, FFOptions? ffOptions = null, CancellationToken cancellationToken = default, public static async Task<IMediaAnalysis> AnalyseAsync(Uri uri, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null) 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 instance = PrepareStreamAnalysisInstance(uri.AbsoluteUri, ffOptions ?? GlobalFFOptions.Current, customArguments);
var result = await instance.StartAndWaitForExitAsync(cancellationToken).ConfigureAwait(false); var result = await instance.StartAndWaitForExitAsync(cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
ThrowIfExitCodeNotZero(result); ThrowIfExitCodeNotZero(result);
return ParseOutput(result); return DeserializeOutput(result);
} }
public static async Task<IMediaAnalysis> AnalyseAsync(Stream stream, FFOptions? ffOptions = null, CancellationToken cancellationToken = default, public static async Task<IMediaAnalysis> AnalyseAsync(Stream stream, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
string? customArguments = null) 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 streamPipeSource = new StreamPipeSource(stream);
var pipeArgument = new InputPipeArgument(streamPipeSource); var pipeArgument = new InputPipeArgument(streamPipeSource);
@ -156,7 +187,7 @@ public static class FFProbe
ThrowIfExitCodeNotZero(result); ThrowIfExitCodeNotZero(result);
pipeArgument.Post(); pipeArgument.Post();
return ParseOutput(result); return DeserializeOutput(result);
} }
public static async Task<FFProbeFrames> GetFramesAsync(Uri uri, FFOptions? ffOptions = null, CancellationToken cancellationToken = default, public static async Task<FFProbeFrames> GetFramesAsync(Uri uri, FFOptions? ffOptions = null, CancellationToken cancellationToken = default,
@ -167,7 +198,7 @@ public static class FFProbe
return ParseFramesOutput(result); return ParseFramesOutput(result);
} }
private static IMediaAnalysis ParseOutput(IProcessResult instance) private static FFProbeAnalysis DeserializeOutput(IProcessResult instance)
{ {
var json = string.Join(string.Empty, instance.OutputData); var json = string.Join(string.Empty, instance.OutputData);
var ffprobeAnalysis = JsonSerializer.Deserialize<FFProbeAnalysis>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); var ffprobeAnalysis = JsonSerializer.Deserialize<FFProbeAnalysis>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
@ -178,7 +209,7 @@ public static class FFProbe
} }
ffprobeAnalysis.ErrorData = instance.ErrorData; ffprobeAnalysis.ErrorData = instance.ErrorData;
return new MediaAnalysis(ffprobeAnalysis); return ffprobeAnalysis;
} }
private static FFProbeFrames ParseFramesOutput(IProcessResult instance) private static FFProbeFrames ParseFramesOutput(IProcessResult instance)

View file

@ -11,7 +11,7 @@ public class FFProbeAnalysis
[JsonPropertyName("chapters")] public List<Chapter> Chapters { get; set; } = null!; [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 public class FFProbeStream : ITagsContainer, IDispositionContainer

View file

@ -4,9 +4,9 @@ using FFMpegCore.Builders.MetaData;
namespace FFMpegCore; namespace FFMpegCore;
internal class MediaAnalysis : IMediaAnalysis public class MediaAnalysis : IMediaAnalysis
{ {
internal MediaAnalysis(FFProbeAnalysis analysis) public MediaAnalysis(FFProbeAnalysis analysis)
{ {
Format = ParseFormat(analysis.Format); Format = ParseFormat(analysis.Format);
Chapters = analysis.Chapters.Select(c => ParseChapter(c)).ToList(); Chapters = analysis.Chapters.Select(c => ParseChapter(c)).ToList();