如何将麦克风输入作为标准输入提供给 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 < /dev/mic > /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 程序的主要内容,如果未能解决你的问题,请参考以下文章