Browse Source

read ffprobe pts output from stdout and stderr (#689)

pull/690/head
Jason Dove 4 years ago committed by GitHub
parent
commit
6a1c2b7659
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      ErsatzTV.Application/ErsatzTV.Application.csproj
  2. 47
      ErsatzTV.Application/Streaming/Queries/GetLastPtsDurationHandler.cs

1
ErsatzTV.Application/ErsatzTV.Application.csproj

@ -8,6 +8,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Bugsnag" Version="3.0.0" /> <PackageReference Include="Bugsnag" Version="3.0.0" />
<PackageReference Include="CliWrap" Version="3.4.1" />
<PackageReference Include="MediatR" Version="10.0.1" /> <PackageReference Include="MediatR" Version="10.0.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.1.46"> <PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.1.46">

47
ErsatzTV.Application/Streaming/Queries/GetLastPtsDurationHandler.cs

@ -1,6 +1,7 @@
using System.Diagnostics; using System.Text;
using System.Text;
using Bugsnag; using Bugsnag;
using CliWrap;
using CliWrap.Buffered;
using ErsatzTV.Core; using ErsatzTV.Core;
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
using ErsatzTV.Core.FFmpeg; using ErsatzTV.Core.FFmpeg;
@ -54,38 +55,34 @@ public class GetLastPtsDurationHandler : IRequestHandler<GetLastPtsDuration, Eit
Option<FileInfo> maybeLastSegment = GetLastSegment(parameters.ChannelNumber); Option<FileInfo> maybeLastSegment = GetLastSegment(parameters.ChannelNumber);
foreach (FileInfo segment in maybeLastSegment) foreach (FileInfo segment in maybeLastSegment)
{ {
var startInfo = new ProcessStartInfo string[] argumentList =
{ {
FileName = parameters.FFprobePath, // `-v 0` seems to prevent ffprobe from outputting anything on windows
RedirectStandardOutput = true, "-show_entries",
RedirectStandardError = true, "packet=pts,duration",
UseShellExecute = false, "-of",
StandardOutputEncoding = Encoding.UTF8, "compact=p=0:nk=1",
StandardErrorEncoding = Encoding.UTF8 "-read_intervals",
"-999999",
segment.FullName
}; };
// `-v 0` seems to prevent ffprobe from outputting anything on windows BufferedCommandResult probe = await Cli.Wrap(parameters.FFprobePath)
startInfo.ArgumentList.Add("-show_entries"); .WithArguments(argumentList)
startInfo.ArgumentList.Add("packet=pts,duration"); .WithValidation(CommandResultValidation.None)
startInfo.ArgumentList.Add("-of"); .ExecuteBufferedAsync(cancellationToken);
startInfo.ArgumentList.Add("compact=p=0:nk=1");
startInfo.ArgumentList.Add("-read_intervals");
startInfo.ArgumentList.Add("-999999");
startInfo.ArgumentList.Add(segment.FullName);
var probe = new Process
{
StartInfo = startInfo
};
probe.Start();
string output = await probe.StandardOutput.ReadToEndAsync();
await probe.WaitForExitAsync(cancellationToken);
if (probe.ExitCode != 0) if (probe.ExitCode != 0)
{ {
return BaseError.New($"FFprobe at {parameters.FFprobePath} exited with code {probe.ExitCode}"); return BaseError.New($"FFprobe at {parameters.FFprobePath} exited with code {probe.ExitCode}");
} }
string output = probe.StandardOutput;
if (string.IsNullOrWhiteSpace(probe.StandardOutput))
{
output = probe.StandardError;
}
try try
{ {
string[] lines = output.Split("\n"); string[] lines = output.Split("\n");

Loading…
Cancel
Save