账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    SDL2播放音频中的一点疑惑
    58
    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??

    感激不尽!!

    1
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    • 填海的精灵 普通会员 1楼

      在使用SDL2播放音频时,有时候可能会遇到一些问题,比如音量调节不准确,播放进度不稳定等。下面我会列出一些可能的问题以及相应的解决方法:

      1. 音量调节不准确:这可能是因为音频流的缓冲不足。你可以尝试增加音频流的缓冲大小,或者尝试在播放过程中定期停止和恢复音频流。另外,你也可以尝试使用更复杂的音频处理函数,比如使用ALSA的ioctl()函数。

      2. 播放进度不稳定:这可能是因为音频流的大小或者频率不均匀。你可以尝试改变音频流的大小,或者改变音频流的频率,或者调整缓冲大小。另外,你也可以尝试使用更复杂的音频处理函数,比如使用ALSA的ioctl()函数。

      3. 音频失真:这可能是因为音频处理函数的问题。你可以尝试改变音频处理函数的参数,或者尝试使用更复杂的音频处理函数。另外,你也可以尝试使用更精确的频率分析方法,比如使用ALSA的frequency分析函数。

      4. 播放速度过快:这可能是因为音频流的缓冲不足。你可以尝试增加音频流的缓冲大小,或者尝试在播放过程中定期停止和恢复音频流。另外,你也可以尝试使用更复杂的音频处理函数,比如使用ALSA的ioctl()函数。

      5. 音频流中断:这可能是因为音频流的缓冲不足。你可以尝试增加音频流的缓冲大小,或者尝试在播放过程中定期停止和恢复音频流。另外,你也可以尝试使用更复杂的音频处理函数,比如使用ALSA的ioctl()函数。

      以上是一些可能的问题以及相应的解决方法,希望对你有所帮助。如果你在使用中遇到更多问题,建议你查阅相关的文档或者在线搜索。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部