gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:42:48 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com