c语言实现音乐播放

一个基本的音乐播放器需要使用第三方库,例如PortAudio或SDL来处理音频。以下是一个简单的例子,使用PortAudio库播放音频文件。

首先,你需要安装PortAudio库。在Linux上,你可以使用包管理器安装它,例如在Ubuntu上使用:

sudo apt-install portaudio19-dev

代码

#include <stdio.h>
#include <portaudio.h>
 
#define SAMPLE_RATE   (44100)
#define FRAMES_PER_BUFFER  (1024)
#define NUM_SECONDS   (5)
#define NUM_CHANNELS   (2)
 
static int callback(const void *inputBuffer, void *outputBuffer,
                   unsigned long framesPerBuffer,
                   const PaStreamCallbackTimeInfo* timeInfo,
                   PaStreamCallbackFlags statusFlags,
                   void *userData) {
    (void) inputBuffer; /* Prevent unused variable warning. */
    float *out = (float*) outputBuffer;
    for (int i = 0; i < framesPerBuffer; i++) {
        *out++ = (float) (*userData) / 32768.0f; /* scale to maximum amplitude */
        (*userData) += 1; /* increment sample pointer */
        if (userData >= &sine[DATA_SIZE]) {
            userData = &sine[0]; /* loop sample buffer */
        }
    }
    return 0;
}
 
int main(int argc, char *argv[]) {
    short sine[NUM_SECONDS * SAMPLE_RATE];
    for (int i = 0; i < NUM_SECONDS * SAMPLE_RATE; ++i) {
        sine[i] = (short)(32767 * sin(2 * M_PI * (i / (double)SAMPLE_RATE)) + 32768);
    }
 
    PaError err = Pa_Initialize();
    if (err != paNoError) {
        fprintf(stderr, "Error initializing PortAudio: %s\n", Pa_GetErrorText(err));
        return err;
    }
 
    PaStream *stream;
    err = Pa_OpenDefaultStream(&stream, NUM_CHANNELS, NUM_CHANNELS, paFloat32, SAMPLE_RATE, FRAMES_PER_BUFFER, callback, &sine);
    if (err != paNoError) {
        fprintf(stderr, "Error opening stream: %s\n", Pa_GetErrorText(err));
        return err;
    }
 
    err = Pa_StartStream(stream);
    if (err != paNoError) {
        fprintf(stderr, "Error starting stream: %s\n", Pa_GetErrorText(err));
        return err;
    }
 
    printf("Play for 5 seconds.\n");
    Pa_Sleep(NUM_SECONDS * 1000);
 
    err = Pa_StopStream(stream);
    if (err != paNoError) {
        fprintf(stderr, "Error stopping stream: %s\n", Pa_GetErrorText(err));
        return err;
    }
 
    err = Pa_CloseStream(stream);
    if (err != paNoError) {
        fprintf(stderr, "Error closing stream: %s\n", Pa_GetErrorText(err));
        return err;
    }
 
    Pa_Terminate();
    return 0;
}

这个代码使用了PortAudio的回调模式播放了一个简单的正弦波,你需要自行扩展代码以支持音频文件的读取和播放。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值