C# ffmpeg输出管道到命名的windows管道

C# ffmpeg输出管道到命名的windows管道,c#,windows,ffmpeg,pipe,named-pipes,C#,Windows,Ffmpeg,Pipe,Named Pipes,这个问题与我的上一个问题有关: 我想通过管道将视频传输到ffmpeg,然后通过另一个管道将其读回,但无法通过管道将ffmpeg.exe的输出传输到windows上的命名管道 我对C#中管道的定义: 然后我用以下选项在一个单独的过程中启动ffmpeg.exe:-f rawvideo-vcodec rawvideo-video\u size 656x492-r 10-pix\u fmt rgb24-I\\.\pipe\to\u ffmpeg-c:v libvpx-pass 1-f webm\.\pi

这个问题与我的上一个问题有关:

我想通过管道将视频传输到ffmpeg,然后通过另一个管道将其读回,但无法通过管道将
ffmpeg.exe
的输出传输到windows上的命名管道

我对C#中管道的定义:

然后我用以下选项在一个单独的过程中启动
ffmpeg.exe
-f rawvideo-vcodec rawvideo-video\u size 656x492-r 10-pix\u fmt rgb24-I\\.\pipe\to\u ffmpeg-c:v libvpx-pass 1-f webm\.\pipe\from\u ffmpeg

ffmpeg.exe拒绝写入管道,错误如下:
文件“\\。\u ffmpeg”中的管道\已存在。覆盖?[是/否]

当我用文件名替换“输出管道”时,它的工作原理类似于charm:
-f rawvideo-vcodec rawvideo-video\u size 656x492-r 10-pix\u fmt rgb24-I\\\.\pipe\to_ffmpeg-c:v libvpx-pass 1-f webm output.webm

如何让ffmpeg在windows中写入命名管道?


编辑:当我使用ffmpeg的
-y
选项强制写入管道时,我得到以下错误:
无法写入输出文件的头#0(编解码器参数不正确?):出现错误编号-32

似乎可以通过将
-y
选项添加到ffmpeg命令并指定管道的缓冲区大小来解决此问题

我的ffmpeg命令(参见Aegistal的评论,为什么我还删除了
-pass 1
标志):
-y-f rawvideo-vcodec rawvideo-video\u size 656x492-r 10-pix\u fmt rgb24-I\.\pipe\to_ffmpeg-c:v libvpx-f webm\.\pipe\from\u ffmpeg

并按如下方式定义命名管道:

p_from_ffmpeg = new NamedPipeServerStream(pipename_from, 
    PipeDirection.In, 
    1, 
    PipeTransmissionMode.Byte, 
    System.IO.Pipes.PipeOptions.WriteThrough, 
    10000, 10000);

删除
-pass 1
参数,因为您没有进行两次编码,请发布完整的控制台输出。@aergistal:谢谢您的评论。看来我解决了这个问题。我必须指定管道的缓冲区大小。我为什么要放弃
-通过1
?我认为这个选项将特别确保libvpx只进行一次传递。我现在遇到了ffmpeg停止处理的问题。但我不能排除这不是接收管道的问题,因为管道阻塞了读取功能。@aergistal:console output:
Input#0,rawvideo,from'\.\pipe\to_ffmpeg::Duration:N/a,start:0.000000,bitrate:77460 kb/s Stream#0:0:Video:rawvideo(RGB[24]/0x18424752),rgb24,656x492,77460 kb/s,10 tbr,10 tbn,10 tbc[libvpx@03a9ff80]v1.4.0输出#0,webm,到“\\.\pipe\from\u ffmpeg”:元数据:编码器:Lavf56.40.101流#0:0:Video:vp8(libvpx),yuv420p,656x492,q=-1--1,通过1200 kb/s,10 fps,1k tbn,10 tbc元数据:编码器:Lavc56.58.100 libvpx流映射:流#0:0->(raw0:0)(本机)->vp8(libvpx))
默认情况下为1-pass。如果指定
-pass 1
,它将创建一个日志文件来保存第二遍(
-pass 2
)的视频统计信息,而第二遍永远不会发生。在2-pass编码中,第一次运行分析视频(您可以放弃其输出),第二次运行进行实际编码。
p_from_ffmpeg = new NamedPipeServerStream(pipename_from, 
    PipeDirection.In, 
    1, 
    PipeTransmissionMode.Byte, 
    System.IO.Pipes.PipeOptions.WriteThrough, 
    10000, 10000);