SDL2播放音频中的一点疑惑

发布于 2022-09-07 21:11:12 字数 1587 浏览 63 评论 0

看到SDL2中 Audio Example 时,对其中的一些代码有些疑惑,代码如下:

// sdl_audio_example.c

#define MAX_AUDIO_FRAME_SIZE 192000

// TODO: 1. 主要的疑问就在这里了,这三个变量的含义是什么??
// TODO: 2. audio_chunk是否可以省略不用了,直接audio_pos = out_buffer??
static Uint8 *audio_chunk;
static Uint32 audio_len;
static Uint8 *audio_pos;

void audio_callback(void *udata, Uint8 *stream, int len)
{
    if ( audio_len == 0 )
        return;

    len = ( len > audio_len ? audio_len : len );
    SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
    
    audio_pos += len;
    audio_len -= len;
}

int main(int argc, char *argv[]){
    // do something ...
    
    uint8_t *out_buffer = (uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE * 3 / 2);
    int out_buffer_size = av_samples_get_buffer_size(NULL, nb_channels, nb_samples, AV_SAMPLE_FMT_S16, 1);
    
    for(;;){
        AVFrame *frame = ...;
        
        swr_convert(swr_ctx,
                    &out_buffer,
                    MAX_AUDIO_FRAME_SIZE,
                    (const uint_8 *)frame->data[0],
                    frame->nb_samples);
                    
        audio_chunk = (uint8_t *)out_buffer;
        audio_len = out_buffer_size;
        audio_pos = audio_chunk;
    }

    return 0;
}

问题
如上代码所示:

  1. audio_chunk、audio_len、audio_pos这三个变量分别代表的含义
  2. audio_pos说是一个静态缓冲区,加上len是如何更新位置的??是否可以画图描述一下?
  3. audio_chunk是否可以省略掉,直接audio_pos=out_buffer??

感激不尽!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文