diff --git a/FFMpegCore.Test/VideoTest.cs b/FFMpegCore.Test/VideoTest.cs index 5de10b1..da6a971 100644 --- a/FFMpegCore.Test/VideoTest.cs +++ b/FFMpegCore.Test/VideoTest.cs @@ -217,7 +217,6 @@ public void Video_ToTS_Args_Pipe() var container = new ArgumentContainer { new CopyArgument(), - new BitStreamFilterArgument(Channel.Video, Filter.H264_Mp4ToAnnexB), new ForceFormatArgument(VideoCodec.MpegTs) }; ConvertFromPipe(VideoType.Ts, container); diff --git a/FFMpegCore/Extend/BitmapVideoFrameWrapper.cs b/FFMpegCore/Extend/BitmapVideoFrameWrapper.cs index 8b86461..bcfdab7 100644 --- a/FFMpegCore/Extend/BitmapVideoFrameWrapper.cs +++ b/FFMpegCore/Extend/BitmapVideoFrameWrapper.cs @@ -25,7 +25,7 @@ public BitmapVideoFrameWrapper(Bitmap bitmap) Format = ConvertStreamFormat(bitmap.PixelFormat); } - public void Serialize(IInputPipe pipe) + public void Serialize(System.IO.Stream stream) { var data = Source.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, Source.PixelFormat); @@ -33,7 +33,7 @@ public void Serialize(IInputPipe pipe) { var buffer = new byte[data.Stride * data.Height]; Marshal.Copy(data.Scan0, buffer, 0, buffer.Length); - pipe.Write(buffer, 0, buffer.Length); + stream.Write(buffer, 0, buffer.Length); } finally { @@ -41,7 +41,7 @@ public void Serialize(IInputPipe pipe) } } - public async Task SerializeAsync(IInputPipe pipe) + public async Task SerializeAsync(System.IO.Stream stream) { var data = Source.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadOnly, Source.PixelFormat); @@ -49,7 +49,7 @@ public async Task SerializeAsync(IInputPipe pipe) { var buffer = new byte[data.Stride * data.Height]; Marshal.Copy(data.Scan0, buffer, 0, buffer.Length); - await pipe.WriteAsync(buffer, 0, buffer.Length); + await stream.WriteAsync(buffer, 0, buffer.Length); } finally { diff --git a/FFMpegCore/FFMPEG/Argument/Atoms/InputPipeArgument.cs b/FFMpegCore/FFMPEG/Argument/Atoms/InputPipeArgument.cs index 1d715a1..bed5897 100644 --- a/FFMpegCore/FFMPEG/Argument/Atoms/InputPipeArgument.cs +++ b/FFMpegCore/FFMPEG/Argument/Atoms/InputPipeArgument.cs @@ -10,7 +10,10 @@ namespace FFMpegCore.FFMPEG.Argument { - public class InputPipeArgument : Argument, IInputPipe + /// + /// Represents input parameter for a named pipe + /// + public class InputPipeArgument : Argument { public string PipeName { get; private set; } public IPipeSource Source { get; private set; } @@ -37,22 +40,6 @@ public void ClosePipe() pipe = null; } - public void Write(byte[] buffer, int offset, int count) - { - if(pipe == null) - throw new InvalidOperationException("Pipe shouled be opened before"); - - pipe.Write(buffer, offset, count); - } - - public Task WriteAsync(byte[] buffer, int offset, int count) - { - if (pipe == null) - throw new InvalidOperationException("Pipe shouled be opened before"); - - return pipe.WriteAsync(buffer, offset, count); - } - public override string GetStringValue() { return $"-y {Source.GetFormat()} -i \\\\.\\pipe\\{PipeName}"; @@ -61,14 +48,14 @@ public override string GetStringValue() public void FlushPipe() { pipe.WaitForConnection(); - Source.FlushData(this); + Source.FlushData(pipe); } public async Task FlushPipeAsync() { await pipe.WaitForConnectionAsync(); - await Source.FlushDataAsync(this); + await Source.FlushDataAsync(pipe); } } } diff --git a/FFMpegCore/FFMPEG/FFMpeg.cs b/FFMpegCore/FFMPEG/FFMpeg.cs index f1bd402..b13dbbd 100644 --- a/FFMpegCore/FFMPEG/FFMpeg.cs +++ b/FFMpegCore/FFMPEG/FFMpeg.cs @@ -493,7 +493,7 @@ private async Task RunProcessAsync(ArgumentContainer container, FileInfo o { _instance?.Dispose(); var arguments = ArgumentBuilder.BuildArguments(container); - + int exitCode = -1; if (container.TryGetArgument(out var inputPipeArgument)) { inputPipeArgument.OpenPipe(); @@ -506,9 +506,16 @@ private async Task RunProcessAsync(ArgumentContainer container, FileInfo o if (inputPipeArgument != null) { - await inputPipeArgument.FlushPipeAsync(); + var task = _instance.FinishedRunning(); + inputPipeArgument.FlushPipe(); + inputPipeArgument.ClosePipe(); + + exitCode = await task; + } + else + { + exitCode = await _instance.FinishedRunning(); } - var exitCode = await _instance.FinishedRunning(); if (!File.Exists(output.FullName) || new FileInfo(output.FullName).Length == 0) throw new FFMpegException(FFMpegExceptionType.Process, string.Join("\n", _instance.ErrorData)); diff --git a/FFMpegCore/FFMPEG/Pipes/IInputPipe.cs b/FFMpegCore/FFMPEG/Pipes/IInputPipe.cs deleted file mode 100644 index d31d047..0000000 --- a/FFMpegCore/FFMPEG/Pipes/IInputPipe.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; - -namespace FFMpegCore.FFMPEG.Pipes -{ - public interface IInputPipe - { - void Write(byte[] buffer, int offset, int count); - Task WriteAsync(byte[] buffer, int offset, int count); - } -} diff --git a/FFMpegCore/FFMPEG/Pipes/IPipeSource.cs b/FFMpegCore/FFMPEG/Pipes/IPipeSource.cs index 943bec6..6768f83 100644 --- a/FFMpegCore/FFMPEG/Pipes/IPipeSource.cs +++ b/FFMpegCore/FFMPEG/Pipes/IPipeSource.cs @@ -9,7 +9,7 @@ namespace FFMpegCore.FFMPEG.Pipes public interface IPipeSource { string GetFormat(); - void FlushData(IInputPipe pipe); - Task FlushDataAsync(IInputPipe pipe); + void FlushData(System.IO.Stream pipe); + Task FlushDataAsync(System.IO.Stream pipe); } } diff --git a/FFMpegCore/FFMPEG/Pipes/IVideoFrame.cs b/FFMpegCore/FFMPEG/Pipes/IVideoFrame.cs index 2458c30..960a36a 100644 --- a/FFMpegCore/FFMPEG/Pipes/IVideoFrame.cs +++ b/FFMpegCore/FFMPEG/Pipes/IVideoFrame.cs @@ -11,7 +11,7 @@ public interface IVideoFrame int Height { get; } string Format { get; } - void Serialize(IInputPipe pipe); - Task SerializeAsync(IInputPipe pipe); + void Serialize(System.IO.Stream pipe); + Task SerializeAsync(System.IO.Stream pipe); } } diff --git a/FFMpegCore/FFMPEG/Pipes/RawVideoPipeSource.cs b/FFMpegCore/FFMPEG/Pipes/RawVideoPipeSource.cs index 586ec0e..27df6c0 100644 --- a/FFMpegCore/FFMPEG/Pipes/RawVideoPipeSource.cs +++ b/FFMpegCore/FFMPEG/Pipes/RawVideoPipeSource.cs @@ -37,29 +37,29 @@ public string GetFormat() return $"-f rawvideo -r {FrameRate} -pix_fmt {StreamFormat} -s {Width}x{Height}"; } - public void FlushData(IInputPipe pipe) + public void FlushData(System.IO.Stream stream) { if (framesEnumerator.Current != null) { - framesEnumerator.Current.Serialize(pipe); + framesEnumerator.Current.Serialize(stream); } while (framesEnumerator.MoveNext()) { - framesEnumerator.Current.Serialize(pipe); + framesEnumerator.Current.Serialize(stream); } } - public async Task FlushDataAsync(IInputPipe pipe) + public async Task FlushDataAsync(System.IO.Stream stream) { if (framesEnumerator.Current != null) { - await framesEnumerator.Current.SerializeAsync(pipe); + await framesEnumerator.Current.SerializeAsync(stream); } while (framesEnumerator.MoveNext()) { - await framesEnumerator.Current.SerializeAsync(pipe); + await framesEnumerator.Current.SerializeAsync(stream); } }