mirror of
https://github.com/rosenbjerg/FFMpegCore.git
synced 2024-11-10 08:34:12 +01:00
Adding support for ffprobe show frames
This commit is contained in:
parent
e6d85eea11
commit
93131a7cd0
2 changed files with 85 additions and 0 deletions
|
@ -25,6 +25,18 @@ public static IMediaAnalysis Analyse(string filePath, int outputCapacity = int.M
|
|||
|
||||
return ParseOutput(instance);
|
||||
}
|
||||
public static FFProbeFrames GetFrames(string filePath, int outputCapacity = int.MaxValue, FFOptions? ffOptions = null)
|
||||
{
|
||||
if (!File.Exists(filePath))
|
||||
throw new FFMpegException(FFMpegExceptionType.File, $"No file found at '{filePath}'");
|
||||
|
||||
using var instance = PrepareProbeInstance(filePath, outputCapacity, ffOptions ?? GlobalFFOptions.Current);
|
||||
var exitCode = instance.BlockUntilFinished();
|
||||
if (exitCode != 0)
|
||||
throw new FFMpegException(FFMpegExceptionType.Process, $"ffprobe exited with non-zero exit-code ({exitCode} - {string.Join("\n", instance.ErrorData)})", null, string.Join("\n", instance.ErrorData));
|
||||
|
||||
return ParseFramesOutput(instance);
|
||||
}
|
||||
public static IMediaAnalysis Analyse(Uri uri, int outputCapacity = int.MaxValue, FFOptions? ffOptions = null)
|
||||
{
|
||||
using var instance = PrepareInstance(uri.AbsoluteUri, outputCapacity, ffOptions ?? GlobalFFOptions.Current);
|
||||
|
@ -66,6 +78,16 @@ public static async Task<IMediaAnalysis> AnalyseAsync(string filePath, int outpu
|
|||
await instance.FinishedRunning().ConfigureAwait(false);
|
||||
return ParseOutput(instance);
|
||||
}
|
||||
|
||||
public static async Task<FFProbeFrames> GetFramesAsync(string filePath, int outputCapacity = int.MaxValue, FFOptions? ffOptions = null)
|
||||
{
|
||||
if (!File.Exists(filePath))
|
||||
throw new FFMpegException(FFMpegExceptionType.File, $"No file found at '{filePath}'");
|
||||
|
||||
using var instance = PrepareProbeInstance(filePath, outputCapacity, ffOptions ?? GlobalFFOptions.Current);
|
||||
await instance.FinishedRunning().ConfigureAwait(false);
|
||||
return ParseFramesOutput(instance);
|
||||
}
|
||||
public static async Task<IMediaAnalysis> AnalyseAsync(Uri uri, int outputCapacity = int.MaxValue, FFOptions? ffOptions = null)
|
||||
{
|
||||
using var instance = PrepareInstance(uri.AbsoluteUri, outputCapacity, ffOptions ?? GlobalFFOptions.Current);
|
||||
|
@ -112,6 +134,17 @@ private static IMediaAnalysis ParseOutput(Instance instance)
|
|||
|
||||
return new MediaAnalysis(ffprobeAnalysis);
|
||||
}
|
||||
private static FFProbeFrames ParseFramesOutput(Instance instance)
|
||||
{
|
||||
var json = string.Join(string.Empty, instance.OutputData);
|
||||
var ffprobeAnalysis = JsonSerializer.Deserialize<FFProbeFrames>(json, new JsonSerializerOptions
|
||||
{
|
||||
PropertyNameCaseInsensitive = true,
|
||||
NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString
|
||||
}) ;
|
||||
|
||||
return ffprobeAnalysis;
|
||||
}
|
||||
|
||||
private static Instance PrepareInstance(string filePath, int outputCapacity, FFOptions ffOptions)
|
||||
{
|
||||
|
@ -126,5 +159,18 @@ private static Instance PrepareInstance(string filePath, int outputCapacity, FFO
|
|||
var instance = new Instance(startInfo) { DataBufferCapacity = outputCapacity };
|
||||
return instance;
|
||||
}
|
||||
private static Instance PrepareProbeInstance(string filePath, int outputCapacity, FFOptions ffOptions)
|
||||
{
|
||||
FFProbeHelper.RootExceptionCheck();
|
||||
FFProbeHelper.VerifyFFProbeExists(ffOptions);
|
||||
var arguments = $"-loglevel error -print_format json -show_frames -v quiet -sexagesimal \"{filePath}\"";
|
||||
var startInfo = new ProcessStartInfo(GlobalFFOptions.GetFFProbeBinaryPath(), arguments)
|
||||
{
|
||||
StandardOutputEncoding = ffOptions.Encoding,
|
||||
StandardErrorEncoding = ffOptions.Encoding
|
||||
};
|
||||
var instance = new Instance(startInfo) { DataBufferCapacity = outputCapacity };
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
39
FFMpegCore/FFProbe/FrameAnalysis.cs
Normal file
39
FFMpegCore/FFProbe/FrameAnalysis.cs
Normal file
|
@ -0,0 +1,39 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace FFMpegCore
|
||||
{
|
||||
public class Frame
|
||||
{
|
||||
public string media_type { get; set; }
|
||||
public int stream_index { get; set; }
|
||||
public int key_frame { get; set; }
|
||||
public long pkt_pts { get; set; }
|
||||
public string pkt_pts_time { get; set; }
|
||||
public long pkt_dts { get; set; }
|
||||
public string pkt_dts_time { get; set; }
|
||||
public long best_effort_timestamp { get; set; }
|
||||
public string best_effort_timestamp_time { get; set; }
|
||||
public int pkt_duration { get; set; }
|
||||
public string pkt_duration_time { get; set; }
|
||||
public long pkt_pos { get; set; }
|
||||
public int pkt_size { get; set; }
|
||||
public long width { get; set; }
|
||||
public long height { get; set; }
|
||||
public string pix_fmt { get; set; }
|
||||
public string pict_type { get; set; }
|
||||
public long coded_picture_number { get; set; }
|
||||
public long display_picture_number { get; set; }
|
||||
public int interlaced_frame { get; set; }
|
||||
public int top_field_first { get; set; }
|
||||
public int repeat_pict { get; set; }
|
||||
public string chroma_location { get; set; }
|
||||
}
|
||||
|
||||
public class FFProbeFrames
|
||||
{
|
||||
public List<Frame> frames { get; set; }
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue