diff --git a/src/FFmpeg.NET/Engine.cs b/src/FFmpeg.NET/Engine.cs old mode 100644 new mode 100755 index 6b7bffa..a3fea1a --- a/src/FFmpeg.NET/Engine.cs +++ b/src/FFmpeg.NET/Engine.cs @@ -87,28 +87,35 @@ public async Task ConvertAsync(IInputArgument input, ConversionOptions o public async Task ConvertAsync(IInputArgument input, Stream output, ConversionOptions options, CancellationToken cancellationToken) { - var pipeName = $"{_pipePrefix}{Guid.NewGuid()}"; + var outputPipeName = $"{_pipePrefix}{Guid.NewGuid()}"; + var outputArgument = new OutputPipe(GetPipePath(outputPipeName)); + var pipe = new NamedPipeServerStream(outputPipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); + var parameters = new FFmpegParameters { Task = FFmpegTask.Convert, Input = input, - Output = new OutputPipe(GetPipePath(pipeName)), + Output = outputArgument, ConversionOptions = options }; - var process = CreateProcess(parameters); - var pipe = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); - - await pipe.WaitForConnectionAsync(cancellationToken); - await Task.WhenAll( - pipe.CopyToAsync(output, cancellationToken), - process.ExecuteAsync(cancellationToken).ContinueWith(x => - { - pipe.Disconnect(); - pipe.Dispose(); - }, cancellationToken) - ).ConfigureAwait(false); - Cleanup(process); + var ffmpegProcess = CreateProcess(parameters); + try + { + var executeProcess = ffmpegProcess.ExecuteAsync(cancellationToken); + var copyData = pipe.WaitForConnectionAsync(cancellationToken) + .ContinueWith(async x => + { + await pipe.CopyToAsync(output, cancellationToken); + }, cancellationToken).Unwrap(); + await Task.WhenAll(executeProcess, copyData).ConfigureAwait(false); + pipe.Disconnect(); + } + finally + { + pipe.Dispose(); + Cleanup(ffmpegProcess); + } } public async Task ConvertAsync(IArgument argument, Stream output, CancellationToken cancellationToken) @@ -119,21 +126,24 @@ public async Task ConvertAsync(IArgument argument, Stream output, CancellationTo var arguments = argument.Argument + $" {outputArgument.Argument}"; var parameters = new FFmpegParameters { CustomArguments = arguments }; - var process = CreateProcess(parameters); - - await Task.WhenAll( - pipe.WaitForConnectionAsync(cancellationToken).ContinueWith(async x => - { - await pipe.CopyToAsync(output, cancellationToken); - }), - process.ExecuteAsync(cancellationToken).ContinueWith(x => - { - pipe.Disconnect(); - pipe.Dispose(); - }, cancellationToken) - ).ConfigureAwait(false); - - Cleanup(process); + + var ffmpegProcess = CreateProcess(parameters); + try + { + var executeProcess = ffmpegProcess.ExecuteAsync(cancellationToken); + var copyData = pipe.WaitForConnectionAsync(cancellationToken) + .ContinueWith(async x => + { + await pipe.CopyToAsync(output, cancellationToken); + }, cancellationToken).Unwrap(); + await Task.WhenAll(executeProcess, copyData).ConfigureAwait(false); + pipe.Disconnect(); + } + finally + { + pipe.Dispose(); + Cleanup(ffmpegProcess); + } } private async Task ExecuteAsync(FFmpegParameters parameters, CancellationToken cancellationToken)