如何将麦克风输入作为标准输入提供给 C 程序

Posted

技术标签:

【中文标题】如何将麦克风输入作为标准输入提供给 C 程序【英文标题】:How to give mic input as stdin to C program 【发布时间】:2021-04-07 04:38:33 【问题描述】:

我目前编写了一个代码,它将原始文件作为输入并进行一些音频处理并将其写入另一个不同的原始文件。

我目前输入的方式是

.\my_code_binary < input.raw > output.raw

如您所见,我将 input.raw 作为标准输入,将 output.raw 作为标准输出,以执行我的程序。

fread(tmp, sizeof(short), channels * size_of_frame, stdin); // the way I am using the input.raw
fwrite(tmp, sizeof(short), channels * FRAME_SIZE, stdout); // the way I am using the output.raw

现在我想让我的程序实时运行,例如,将我的麦克风输入作为标准输入,将麦克风输出作为标准输出。任何资源或代码 sn-ps 都会帮助我,我是 C 音频处理的初学者。

编辑:我使用的是 Raspberry Pi 4

【问题讨论】:

听起来更像是操作系统问题,而不是 C 编程问题。你知道你要读/写的设备吗? 这是一个 RPi 4,抱歉我错过了 您是否尝试重定向设备而不是文件? ./my_code_binary &lt; /dev/mic &gt; /dev/audio 之类的东西(我手头没有 Raspi,名字很可能是错误的)? 什么创造了input.raw input.raw 只是一个原始文件记录,我刚刚通过 SSH 加载到我的 RPi 上。 【参考方案1】:

为避免 shell 重定向,您可以尝试以下操作:

#include <stdio.h>
#include <stdlib.h>

int main() 

    FILE *infile, *outfile;
    int c;

    infile = fopen("myinfile", "r");
    outfile = fopen("myoutfile", "w");

    while((c = getc(infile)) != EOF) 
        c = c * 2;  // do something
        putc(c,outfile);
    

    fclose(infile);
    fclose(outfile);

但是,这不是实时的,因为文件myinfile 已经存在。由于 Linux 将所有设备作为文件处理,您可以尝试使用与麦克风关联的设备文件为myinfile,例如/dev/mymicrophone

您也可以考虑使用更基本的 Low-Level-I/O 函数,这些函数使用文件描述符而不是 struct FILE

【讨论】:

以上是关于如何将麦克风输入作为标准输入提供给 C 程序的主要内容,如果未能解决你的问题,请参考以下文章

在 **portable C** 中,如何启动将命令的标准输入连接到启动器的标准输出的命令?

将输入从标准输入传递到函数时进行缓冲

Python3 输入输出和File(文件) 方法

如何在nodejs里调用执行系统命令

如何写入另一个应用程序的标准输入?

杀死父进程后将标准输入传递给子进程