用c语言编写一个在linux下使用oss播放音频文件的程序

用c语言编写一个在linux下使用oss播放音频文件的程序,c,linux,audio,open-source,C,Linux,Audio,Open Source,我在使用OSS播放音频文件时遇到问题。 我想通过在linux ubuntu的声卡上写入从服务器接收的文件来播放它。 下面的代码是我的套接字编程的一部分。 我从服务器接收文件,然后使用write()部件将recvBuf[]中的数据写入声卡。我尝试在这个程序中播放的格式是pcm、wav、raw。我听说OSS可以播放原始PCM文件,但我不能确切知道原始PCM文件的扩展名是什么。(或者只是一个调制) 我想知道的两件事是 此程序可播放哪种类型的音频文件 如何设置播放此音频文件的变量(RATE、CHANN

我在使用OSS播放音频文件时遇到问题。 我想通过在linux ubuntu的声卡上写入从服务器接收的文件来播放它。 下面的代码是我的套接字编程的一部分。 我从服务器接收文件,然后使用
write()
部件将
recvBuf[]
中的数据写入声卡。我尝试在这个程序中播放的格式是pcm、wav、raw。我听说OSS可以播放原始PCM文件,但我不能确切知道原始PCM文件的扩展名是什么。(或者只是一个调制)

我想知道的两件事是

  • 此程序可播放哪种类型的音频文件

    • 如何设置播放此音频文件的变量(
      RATE、CHANNELS、SIZE、BUFSIZE、ioctl(arguments)
      等)
  • 如果这个代码有问题,哪个部分有什么问题

  • 我提到

    printf(“opendev\n”);
    如果((句柄=打开(“/dev/dsp”,O_RDWR))=-1)
    {
    DWE(“公开”);
    }
    如果(ioctl(句柄、声音、PCM写入位和参数)=-1)
    {
    DWE(“ioctl立体声”);
    }
    如果(ioctl(手柄、声音、PCM、写入通道和通道)=-1)
    {
    DWE(“ioctl立体声”);
    }
    如果(ioctl(手柄、声音、PCM、写入速率和速率)=-1)
    {
    DWE(“ioctl采样率”);
    }
    memset(recvBuf,0,BUFSIZE);
    printf(“开始\n”);
    而(!endOfList)
    {
    if(recv(sock,&fileSize,4,0)<0)
    DWE(“文件大小记录失败”);
    if(recv(sock和msgSize,4,0)<0)
    DWE(“msgSize recv失败”);
    if(recv(sock,musName,msgSize,0)<0)
    DWE(“musName recv fail”);
    printf(“播放%s…\n”,musName);
    //if((fp=fopen(musName,“wb”))==NULL)
    //DWE(“fopen musName失败”);
    计数=1;
    当(外出){
    如果(文件大小>BUFSIZE)
    {
    如果((recvFileSize=recv(sock,recvBuf,BUFSIZE,0))<0)
    DWE(“文件记录失败”);
    fileSize-=recvFileSize;
    //fwrite(recvBuf、sizeof(无符号字符)、BUFSIZE、fp);
    如果(发送(sock和start,4,0)!=4)
    DWE(“启动发送失败”);
    }
    其他的
    {
    printf(“已记录的文件”);
    if(recv(sock,recvBuf,fileSize,0)<0)
    DWE(“文件记录失败”);
    //fwrite(recvBuf、sizeof(无符号字符)、fileSize、fp);
    out=0;
    }
    if((状态=写入(句柄、recvBuf、strlen(recvBuf)))=-1)
    {
    DWE(“声音写入错误”);
    }
    计数=0;
    memset(recvBuf,0,strlen(recvBuf));
    }
    printf(“下线记录”);
    if(recv(sock和endOfList,4,0)<0)
    DWE(“下线回收失败”);
    }
    关闭(手柄);
    //fclose(fp);
    

    }

    我不知道OSS,但它与ALSA一起工作。但是由于你使用的是ubuntu,要么ALSA已经存在,要么你可以很容易地安装它

    首先,如果需要播放原始录音,您需要知道采样率、通道数(单声道或立体声)和每个采样的位数。如果传入的文件是.wav格式,则该文件包含有关采样率的所有信息,因此可以由传统媒体播放器或自定义程序轻松播放,而无需指定它们。原始PCM录制缺少此信息

    aplay -r 44100 -f S16_LE -c 1 <filename>
    
    aplay-r 44100-f S16_LE-c 1
    
    上面的命令(在ubuntu终端中输入)将播放原始PCM录音。44100是采样率,S16_LE表示小端字节中的每个采样16位,“1”表示单通道(mono)。如果设置的采样率太高,则播放会发出吱吱声。如果设置得太低,录音就会听起来像愤怒的恐龙。因此,简而言之,如果要按原样播放原始PCM,您需要事先知道这些参数


    但是,如果您想使用程序回放文件,则需要ALSAAPI。我是python迷,因此我使用pyalsaaudio API回放原始PCM。同样的任务也可以通过c API完成。该页面有一些相关信息。示例演示如何播放原始pcm和wav文件。

    BTW:OSS位于当前内核中,标记为已弃用。OSS在Linux上早已被ALSA取代。无法保证它甚至会出现在许多发行版中。
    aplay -r 44100 -f S16_LE -c 1 <filename>