【问题标题】:ffmpeg output pipeing to named windows pipeffmpeg 输出管道到命名的 Windows 管道
【发布时间】:2015-11-16 10:17:35
【问题描述】:

这个问题和我之前的问题有关:Converting raw frames into webm live stream

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

我在 C# 中对管道的定义:

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 拒绝写入管道并出现以下错误:File '\\.\pipe\from_ffmpeg' already exists. Overwrite ? [y/N]

当我用文件名替换“输出管道”时,它就像魅力一样工作:-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 中的命名管道?

编辑:当我使用 ffmpeg 的 -y 选项强制写入管道时,我收到以下错误:Could not write header for output file #0 (incorrect codec parameters ?): Error number -32 occurred

【问题讨论】:

  • 删除 -pass 1 参数,因为您没有进行两次编码并发布完整的控制台输出。
  • @aergistal:感谢您的评论。好像我解决了这个问题。我必须指定管道的缓冲区大小。我为什么要放弃-pass 1?我认为这个选项会专门确保 libvpx 只通过一次。我现在遇到了ffmpeg停止处理的问题。但我不能排除这不是接收管道的问题,因为管道阻塞了读取功能。
  • @aergistal:控制台输出: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 k b/s, 10 tbr, 10 tbn, 10 tbc [libvpx @ 03a9ff80] v1.4.0 Output #0, webm, to '\\.\pipe\from_ffmpeg': Metadata: encoder : Lavf56.40.101 Stream #0:0: Video: vp8 (libvpx), yuv420p, 656x492, q=-1--1, pass 1, 200 kb/ s, 10 fps, 1k tbn, 10 tbc Metadata: encoder : Lavc56.58.100 libvpx Stream mapping: Stream #0:0 -> #0:0 (rawvideo (native) -> vp8 (libvpx))
  • 默认为 1-pass。如果您指定-pass 1,它会创建一个日志文件来保存第二遍 (-pass 2) 的视频统计信息,这永远不会发生。在 2-pass 编码中,第一次运行分析视频(您可以丢弃它的输出),第二次运行实际编码。

标签: c# windows ffmpeg pipe named-pipes


【解决方案1】:

似乎可以通过在 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2016-09-29
    • 2020-02-27
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多