用popen读取C中的arecord输出

时间:2018-04-26 23:06:46

标签: c linux piping

我尝试使用c:

来管道arecord的输出
shouldComponentUpdate()

我选择了#34; long"因为"签名32位" arecord命令中的规范。然而,gnuplot让我觉得无稽之谈。程序也会在几毫秒后完成,尽管我想录制4秒钟。我究竟做错了什么?

1 个答案:

答案 0 :(得分:3)

似乎fscanf()用于不用于二进制的文本。感谢巴勃罗。修正后的版本如下:

int main(int argc,char *argv[]){    
    FILE* file = popen("arecord -q -t raw -r 8000 --format S32_LE -D plughw:0,0 -d 4", "r");
    int32_t buffer[100];
    FILE *fp;
    fp=fopen("./record.dat", "w+"); 
    int i,k,s;

    for (i=0; i<100; i++){
        fread(&buffer, sizeof(int32_t), 100,  file);
        for (k=0; k<100; k++){
            s = k + 100 * i;
            fprintf(fp,"%d\t%d\n", s , buffer[k] ) ; 
        }    

    }

    pclose(file);
    fclose(fp) ;

    FILE *p = popen(GNUPLOT,"w");
    fprintf(p, "set xrange [3000:3400]\n");
    fprintf(p,"plot 'record.dat' lt rgb 'red' title 'raw' \n");
    fclose(p);

    return 0;
}

返回一个漂亮的情节: waves