c - 使用c语言在linux下使用oss制作一个可以播放音频文件的程序

标签 c linux audio open-source

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

我想知道的两件事是

  1. 此程序可以播放哪种类型的音频文件?

    • 如何设置变量(RATE、CHANNELS、SIZE、BUFSIZE、ioctl(参数) 等)才能播放此音频文件?
  2. 如果这段代码有问题,哪部分有问题?

我引用了http://www2.warwick.ac.uk/fac/sci/physics/research/epp/people/andrew_bennieston/projects/fragments/pcmplay.c

printf("opendev\n");
if ( (handle = open("/dev/dsp",O_RDWR)) == -1 )
{
    DWE("open");
}

if ( ioctl(handle,  SOUND_PCM_WRITE_BITS, &arg) == -1 )
{
    DWE("ioctl stereo");
}
if ( ioctl(handle, SOUND_PCM_WRITE_CHANNELS,&channels) == -1 )
{
    DWE("ioctl stereo");
}

if (ioctl(handle, SOUND_PCM_WRITE_RATE,&rate) == -1 )
{
    DWE("ioctl sample rate");
}

memset(recvBuf, 0,BUFSIZE);

printf("start\n");
while(!endOfList)
{

    if(recv(sock, &fileSize, 4, 0) < 0)
        DWE("fileSize recv fail");

    if(recv(sock, &msgSize, 4, 0) < 0)
        DWE("msgSize recv fail");

    if(recv(sock, musName, msgSize, 0) < 0)
        DWE("musName recv fail");

    printf("Playing %s...\n", musName);

    //if((fp = fopen(musName, "wb")) == NULL)
        //DWE("fopen musName fail");
    count = 1;

    while(out){         

        if(fileSize > BUFSIZE)
        {
            if((recvFileSize = recv(sock, recvBuf, BUFSIZE, 0)) < 0)
                DWE("file recv fail");
            fileSize -= recvFileSize;
            //fwrite(recvBuf, sizeof(unsigned char), BUFSIZE, fp);
            if(send(sock, &start, 4, 0) != 4)
                DWE("start send fail");
        }
        else
        {
            printf("recved file\n");                
            if(recv(sock, recvBuf, fileSize, 0) < 0)
                DWE("file recv fail");
            //fwrite(recvBuf, sizeof(unsigned char), fileSize, fp);
            out = 0;

        }

        if((status = write(handle, recvBuf, strlen(recvBuf))) == -1)
        {
            DWE("SOUND_write_ERROR");
        }
        count = 0;
        memset(recvBuf, 0, strlen(recvBuf));
    }
    printf("eol recv\n");
    if(recv(sock, &endOfList, 4, 0) < 0)
        DWE("eOL recv fail");

}
close(handle);
//fclose(fp);

}

最佳答案

我不知道 OSS,但这适用于 ALSA。但由于您使用的是 ubuntu,ALSA 要么已经存在,要么您可以轻松安装它。

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

aplay -r 44100 -f S16_LE -c 1 <filename>

以上命令(在 ubuntu 终端中输入)将播放 RAW PCM 录音。 44100 是采样率,S16_LE 表示小尾数中每个样本 16 位,“1”表示单 channel (单 channel )。如果采样率设置得太高,那么播放时会出现吱吱声。将其设置得太低,录音听起来就像愤怒的恐龙。简而言之,如果您想按原样播放原始 PCM,您需要事先了解这些参数。

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

关于c - 使用c语言在linux下使用oss制作一个可以播放音频文件的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20420130/

相关文章:

c++ - 如何引用结构变量并使用或不使用指针进行初始化

c - 重复 timerfd 事件适用于 epoll 而不是 poll

python - Pip 不适用于 Ubuntu 上的 Python 3.10

javascript - 如何将按键存储到变量中以重构此代码?

c - 如何处理纯 C 中的严格枚举?

c - 以下处理指针的代码有什么问题?

c - clutter1.0如何设置舞台或窗口的位置?

actionscript - 事件监听器调用了错误的函数

java - 将声音放入 Java 应用程序的最佳方法是什么?

C Programming::accept() 在压力测试中工作然后不工作