mirror of
https://github.com/rosenbjerg/FFMpegCore.git
synced 2024-11-10 08:34:12 +01:00
Added OutputPipeArgument
This commit is contained in:
parent
ea7acf2140
commit
8434ffbba6
5 changed files with 119 additions and 3 deletions
|
@ -16,7 +16,7 @@ namespace FFMpegCore.FFMPEG.Argument
|
|||
public class InputPipeArgument : Argument
|
||||
{
|
||||
public string PipeName { get; private set; }
|
||||
public string PipePath => $@"\\.\pipe\{PipeName}";
|
||||
public string PipePath => PipeHelpers.GetPipePath(PipeName);
|
||||
public IPipeSource Source { get; private set; }
|
||||
|
||||
private NamedPipeServerStream pipe;
|
||||
|
@ -24,7 +24,7 @@ public class InputPipeArgument : Argument
|
|||
public InputPipeArgument(IPipeSource source)
|
||||
{
|
||||
Source = source;
|
||||
PipeName = "FFMpegCore_Pipe_" + Guid.NewGuid();
|
||||
PipeName = PipeHelpers.GetUnqiuePipeName();
|
||||
}
|
||||
|
||||
public void OpenPipe()
|
||||
|
@ -43,7 +43,7 @@ public void ClosePipe()
|
|||
|
||||
public override string GetStringValue()
|
||||
{
|
||||
return $"-y {Source.GetFormat()} -i {PipePath}";
|
||||
return $"-y {Source.GetFormat()} -i \"{PipePath}\"";
|
||||
}
|
||||
|
||||
public void FlushPipe()
|
||||
|
|
53
FFMpegCore/FFMPEG/Argument/Atoms/OutputPipeArgument.cs
Normal file
53
FFMpegCore/FFMPEG/Argument/Atoms/OutputPipeArgument.cs
Normal file
|
@ -0,0 +1,53 @@
|
|||
using FFMpegCore.FFMPEG.Pipes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Pipes;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFMpegCore.FFMPEG.Argument
|
||||
{
|
||||
public class OutputPipeArgument : Argument
|
||||
{
|
||||
public string PipeName { get; private set; }
|
||||
public string PipePath => PipeHelpers.GetPipePath(PipeName);
|
||||
public IPipeDataReader Reader { get; private set; }
|
||||
|
||||
private NamedPipeClientStream pipe;
|
||||
|
||||
public OutputPipeArgument(IPipeDataReader reader)
|
||||
{
|
||||
Reader = reader;
|
||||
PipeName = PipeHelpers.GetUnqiuePipeName();
|
||||
}
|
||||
|
||||
public void OpenPipe()
|
||||
{
|
||||
if(pipe != null)
|
||||
throw new InvalidOperationException("Pipe already has been opened");
|
||||
|
||||
pipe = new NamedPipeClientStream(PipePath);
|
||||
}
|
||||
|
||||
public void ReadData()
|
||||
{
|
||||
Reader.ReadData(pipe);
|
||||
}
|
||||
|
||||
public Task ReadDataAsync()
|
||||
{
|
||||
return Reader.ReadDataAsync(pipe);
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
pipe?.Dispose();
|
||||
pipe = null;
|
||||
}
|
||||
|
||||
public override string GetStringValue()
|
||||
{
|
||||
return $"\"{PipePath}\"";
|
||||
}
|
||||
}
|
||||
}
|
13
FFMpegCore/FFMPEG/Pipes/IPipeDataReader.cs
Normal file
13
FFMpegCore/FFMPEG/Pipes/IPipeDataReader.cs
Normal file
|
@ -0,0 +1,13 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFMpegCore.FFMPEG.Pipes
|
||||
{
|
||||
public interface IPipeDataReader
|
||||
{
|
||||
void ReadData(System.IO.Stream stream);
|
||||
Task ReadDataAsync(System.IO.Stream stream);
|
||||
}
|
||||
}
|
16
FFMpegCore/FFMPEG/Pipes/PipeHelpers.cs
Normal file
16
FFMpegCore/FFMPEG/Pipes/PipeHelpers.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FFMpegCore.FFMPEG.Pipes
|
||||
{
|
||||
static class PipeHelpers
|
||||
{
|
||||
public static string GetUnqiuePipeName() => "FFMpegCore_Pipe_" + Guid.NewGuid();
|
||||
|
||||
public static string GetPipePath(string pipeName)
|
||||
{
|
||||
return $@"\\.\pipe\{pipeName}";
|
||||
}
|
||||
}
|
||||
}
|
34
FFMpegCore/FFMPEG/Pipes/StreamPipeDataReader.cs
Normal file
34
FFMpegCore/FFMPEG/Pipes/StreamPipeDataReader.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FFMpegCore.FFMPEG.Pipes
|
||||
{
|
||||
public class StreamPipedataReader : IPipeDataReader
|
||||
{
|
||||
public System.IO.Stream DestanationStream { get; private set; }
|
||||
public int BlockSize { get; set; } = 4096;
|
||||
|
||||
public StreamPipedataReader(System.IO. Stream destanationStream)
|
||||
{
|
||||
DestanationStream = destanationStream;
|
||||
}
|
||||
|
||||
public void ReadData(System.IO.Stream stream)
|
||||
{
|
||||
int read;
|
||||
var buffer = new byte[BlockSize];
|
||||
while((read = stream.Read(buffer, 0, buffer.Length)) != 0)
|
||||
DestanationStream.Write(buffer, 0, buffer.Length);
|
||||
}
|
||||
|
||||
public async Task ReadDataAsync(System.IO.Stream stream)
|
||||
{
|
||||
int read;
|
||||
var buffer = new byte[BlockSize];
|
||||
while ((read = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
|
||||
await DestanationStream.WriteAsync(buffer, 0, buffer.Length);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue