簡體   English   中英

制作一個可以通過C語言使用oss在linux中播放音頻文件的程序

[英]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文件具有什么擴展名。(或僅僅是一種調制方式)

我想知道的兩件事是

  1. 該程序可以播放哪種類型的音頻文件?

    • 我如何設置變量( RATE, CHANNELS, SIZE, BUFSIZE, ioctl(arguments)等)來播放此音頻文件?
  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記錄,則需要了解采樣率,通道數(單聲道或立體聲)和每個樣本的位數。 如果您的傳入文件位於.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM