C# ffmpeg输出管道到命名的windows管道
这个问题与我的上一个问题有关: 我想通过管道将视频传输到ffmpeg,然后通过另一个管道将其读回,但无法通过管道将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.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);