[英]making a program that can play audio files in linux using oss by c language
我在使用OSS播放音頻文件時遇到問題。 我想播放從服務器接收的文件,方法是將其寫入linux ubuntu的聲卡中。 下面的代碼是我的套接字編程的一部分。 我從服務器收到文件,然后使用write()
部分將recvBuf[]
的數據寫入聲卡。 我嘗試在此程序上播放的格式是pcm,wav,raw。 我聽說OSS可以播放原始PCM文件,但我無法確切知道原始PCM文件具有什么擴展名。(或僅僅是一種調制方式)
我想知道的兩件事是
該程序可以播放哪種類型的音頻文件?
RATE, CHANNELS, SIZE, BUFSIZE, ioctl(arguments)
等)來播放此音頻文件? 如果此代碼有問題,哪一部分有什么問題?
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記錄,則需要了解采樣率,通道數(單聲道或立體聲)和每個樣本的位數。 如果您的傳入文件位於.wav中,則該文件包含有關采樣率的所有信息,因此,無需指定它們即可通過常規媒體播放器或自定義程序輕松播放。 RAW PCM錄音缺少此信息。
aplay -r 44100 -f S16_LE -c 1 <filename>
上面的命令(在ubuntu終端中鍵入)將播放RAW PCM錄音。 44100是采樣率,S16_LE表示每個樣本以低字節序為16位,'1'表示單通道(單聲道)。 如果您將采樣率設置得太大,則播放會吱吱作響。 設置得太低,錄音將聽起來像是憤怒的恐龍。 簡而言之,如果您想按原樣播放原始PCM,則需要事先知道這些參數。
但是,如果要使用程序播放文件,則需要ALSA API。 我是Python迷,因此我使用pyalsaaudio API播放RAW PCM。 同樣的任務也可以通過c API來完成。 pyalsaaudio頁面包含一些相關信息。 這些示例演示了如何播放原始pcm和wav文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.