这个问题与我以前的问题有关: 将原始帧转换成webm直播stream
我想pipe一个video到ffmpeg并通过另一个pipe道读回来,但是我不能将ffmpeg.exe
的输出传送到windows上的一个命名pipe道。
我在C#中定义pipe道:
NamedPipeServerStream p_to_ffmpeg; NamedPipeServerStream p_from_ffmpeg; p_to_ffmpeg = new NamedPipeServerStream("to_ffmpeg", PipeDirection.Out, 1, PipeTransmissionMode.Byte); p_from_ffmpeg = new NamedPipeServerStream("from_ffmpeg", PipeDirection.In, 1, PipeTransmissionMode.Byte);
然后我在一个单独的进程中使用以下选项启动ffmpeg.exe
: -f rawvideo -vcodec rawvideo -video_size 656x492 -r 10 -pix_fmt rgb24 -i \\.\pipe\to_ffmpeg -c:v libvpx -pass 1 -f webm \\.\pipe\from_ffmpeg
ffmpeg.exe拒绝写入具有以下错误的pipe道: File '\\.\pipe\from_ffmpeg' already exists. Overwrite ? [y/N]
File '\\.\pipe\from_ffmpeg' already exists. Overwrite ? [y/N]
当我用文件名replace“输出pipe道”时,它的工作方式如下: -f rawvideo -vcodec rawvideo -video_size 656x492 -r 10 -pix_fmt rgb24 -i \\.\pipe\to_ffmpeg -c:v libvpx -pass 1 -f webm output.webm
我如何获得ffmpeg写入Windows命名pipe道?
编辑:当我强制使用ffmpeg的-y
选项写入pipe道时,出现以下错误: Could not write header for output file #0 (incorrect codec parameters ?): Error number -32 occurred
看起来问题可以通过向ffmpeg命令添加-y
选项并指定管道的缓冲区大小来解决。
我的ffmpeg命令(见aergistal的评论为什么我也删除了-pass 1
标志):- -y -f rawvideo -vcodec rawvideo -video_size 656x492 -r 10 -pix_fmt rgb24 -i \\.\pipe\to_ffmpeg -c:v libvpx -f webm \\.\pipe\from_ffmpeg
并定义命名管道如下:
p_from_ffmpeg = new NamedPipeserverStream(pipename_from, PipeDirection.In, 1, PipeTransmissionMode.Byte, System.IO.Pipes.PipeOptions.WriteThrough, 10000, 10000);