美文网首页
QT开发 SDL播放pcm

QT开发 SDL播放pcm

作者: 我有一只小毛驴_从来都不骑 | 来源:发表于2021-08-10 18:41 被阅读0次

在子线程中播放
核心代码

// 采样率
#define SAMPLE_RATE 44100
// 采样格式
#define SAMPLE_FORMAT AUDIO_S16LSB
// 采样大小
#define SAMPLE_SIZE SDL_AUDIO_BITSIZE(SAMPLE_FORMAT)
// 声道数
#define CHANNELS 2
// 音频缓冲区的样本数量
#define SAMPLES 1024
// 每个样本占用多少个字节
#define BYTES_PER_SAMPLE ((SAMPLE_SIZE * CHANNELS) >> 3)  // 相当于 /8
// 文件缓冲区的大小
#define BUFFER_SIZE (SAMPLES * BYTES_PER_SAMPLE)

typedef struct {
    int len = 0;
    int pullLen = 0;
    Uint8 *data = nullptr;
} AudioBuffer;

 // 初始化Audio子系统
    if (SDL_Init(SDL_INIT_AUDIO)) {
        qDebug() << "SDL_Init error" << SDL_GetError();
        return;
    }

    // 音频参数
    SDL_AudioSpec spec;
    // 采样率
    spec.freq = SAMPLE_RATE;
    // 采样格式(s16le)
    spec.format = SAMPLE_FORMAT;
    // 声道数
    spec.channels = CHANNELS;
    // 音频缓冲区的样本数量(这个值必须是2的幂)
    spec.samples = SAMPLES;
    // 回调
    spec.callback = pull_audio_data;
    // 传递给回调的参数
    AudioBuffer buffer;
    spec.userdata = &buffer;

    // 打开设备
    if (SDL_OpenAudio(&spec, nullptr)) {
        qDebug() << "SDL_OpenAudio error" << SDL_GetError();
        // 清除所有的子系统
        SDL_Quit();
        return;
    }

    // 打开文件
    QFile file(FILENAME);
    if (!file.open(QFile::ReadOnly)) {
        qDebug() << "file open error" << FILENAME;
        // 关闭设备
        SDL_CloseAudio();
        // 清除所有的子系统
        SDL_Quit();
        return;
    }

    // 开始播放(0是取消暂停)
    SDL_PauseAudio(0);

    // 存放从文件中读取的数据
    Uint8 data[BUFFER_SIZE];
    while (!isInterruptionRequested()) {
        // 只要从文件中读取的音频数据,还没有填充完毕,就跳过
        if (buffer.len > 0) continue;

        buffer.len = file.read((char *) data, BUFFER_SIZE);

        // 文件数据已经读取完毕  
       //延长线程存活时间  有可能线程结束了 pcm还没放完
        if (buffer.len <= 0) { 
            // 剩余的样本数量
            int samples = buffer.pullLen / BYTES_PER_SAMPLE;
            int ms = samples * 1000 / SAMPLE_RATE;
            SDL_Delay(ms);
            break;
        }

        // 读取到了文件数据
        buffer.data = data;
    }

    // 关闭文件
    file.close();

    // 关闭设备
    SDL_CloseAudio();
    // 清除所有的子系统
    SDL_Quit();

相关文章

  • QT开发 SDL播放pcm

    在子线程中播放核心代码

  • FFmpeg播放PCM, WAV

    播放PCM步骤 初始化SDL SDL_Init(SDL_INIT_AUDIO) 设置SDL音频参数 SDL_Aud...

  • FFmpeg+SDL2实现音频流播放

    SDL2文章列表 SDL2入门 SDL2事件处理 SDL2纹理渲染 SDL2 PCM音频播放 FFmpeg+SDL...

  • 播放 WAV

    一、使用命令行播放 二、使用 SDL2 API 播放 1、创建 Qt 工程,参考 Mac开发环境搭建[everno...

  • SDL 播放PCM音频

    生成 pcm 音频 mp3 截取$ ffmpeg -i test.mp3 -ss 00:00:10 -t 00:0...

  • SDL实现PCM播放器

    sdl实现pcm播放主要包括以下几个步骤:打开音频设备-->设置音频参数(采样率、采样大小、通道数等)-->向声卡...

  • 09_使用SDL播放PCM

    通过命令ffpay播放PCM 可以使用ffplay播放《08_音频录制02_编程[https://www.jian...

  • Qt调用aplay播放PCM

    今天接到个任务,让我用Qt播放PCM,这个简单,随便一百度就有了。 不过在运行的时候出了问题 嘶~ 好像是alsa...

  • 使用SDL播放PCM音频数据

    一、使用 ffplay 命令行程序播放 首先使用 ffmpeg 命令行程序抽出 pcm 数据: 使用 ffplay...

  • 「SDL第七篇」PCM音频播放器的实现

    前言 今天向大家介绍一下如何通过 SDL 实现一个PCM音频播放器。这是一个最简单的播放器,它不涉及到音频的解复用...

网友评论

      本文标题:QT开发 SDL播放pcm

      本文链接:https://www.haomeiwen.com/subject/esdfbltx.html