如何在单个应用程序上使用win32管道

How to use win32 pipe on single application

本文关键字:win32 管道 程序上 应用程序 单个 应用      更新时间:2023-10-16

我正试图写入本地创建的管道(在同一应用程序中)
目前我有这个:

audioPipe = CreateNamedPipe(
    L"\\.\pipe\audioPipe", // name of the pipe
    PIPE_ACCESS_OUTBOUND, // 1-way pipe -- send only
    PIPE_TYPE_MESSAGE, // send data as a byte stream
    1, // only allow 1 instance of this pipe
    0, // no outbound buffer
    0, // no inbound buffer
    0, // use default wait time
    NULL // use default security attributes
);

我不知道如何实际向它写入数据。我想使用WriteFile(),但它还有更多的数据吗?我读到的所有例子似乎都在使用客户端-服务器系统,我不需要它。我只需要将数据写入管道(希望ffmpeg能接收到)

根据注释,您正在创建一个命名管道,命令行FFMPEG应用程序将连接到该管道。为了使其工作,您需要做三件事:

  1. 将您的呼叫更改为CreateNamedPipe()以使用PIPE_TYPE_BYTE而不是PIPE_TYPE_MESSAGE,因为您将实时将原始数据流式传输到FFMPEG,而不是消息。这将允许FFMPEG使用它想要的任意缓冲区等从管道中读取数据,就像它直接从真实文件中读取一样。

    audioPipe = CreateNamedPipe(
        L"\\.\pipe\audioPipe", // name of the pipe
        PIPE_ACCESS_OUTBOUND, // 1-way pipe -- send only
        PIPE_TYPE_BYTE, // send data as a byte stream
        1, // only allow 1 instance of this pipe
        0, // no outbound buffer
        0, // no inbound buffer
        0, // use default wait time
        NULL // use default security attributes
    );
    
  2. 您需要调用ConnectNamedPipe()接受来自FFMPEG的连接,然后才能向其写入数据。

    ConnectNamedPipe(audioPipe, NULL);
    
  3. 运行FFMPEG时,使用-i参数指定管道名称作为输入文件名,例如:ffmpeg -i \.pipeaudioPipe

没有什么比调用WriteFile更重要的了。您还需要先调用ConnectNamedPipe,然后再调用WriteFile以等待客户端连接。

客户端通过使用CreateFile打开句柄,然后使用ReadFile进行读取来读取管道。

对于字节流,您需要PIPE_TYPE_BYTE。是否确实要为缓冲区大小指定0?