ffplay 控制音量的代码实现

ffplay音频音量控制的代码

 

主要分享一下音量控制部分的代码实现

一、音量的大小调整函数

1.在void event_loop(VideoState *cur_stream)  这个事件循环函数下,响应4个数字按键(0,9,+,-)

case SDLK_KP_MULTIPLY:
case SDLK_0:
                update_volume(cur_stream, 1, SDL_VOLUME_STEP);//音量的增加
                break;

case SDLK_KP_DIVIDE:
case SDLK_9:
                update_volume(cur_stream, -1, SDL_VOLUME_STEP);//音量的减小
                break;

2.通过如下函数void update_volume(VideoState *is, int sign, double step),来控制每次调整的节拍,最大是128(#define SDL_MIX_MAXVOLUME 128),下面的两个对数函数是节拍的具体实现,128->117->107 .... 这样个节拍

double volume_level_new = 20 * log(is->audio_volume / (double)SDL_MIX_MAXVOLUME) / log(10);   
double volume_level = is->audio_volume ? volume_level_new : -1000.0;
int new_volume = lrint(SDL_MIX_MAXVOLUME * pow(10.0, (volume_level + sign * step) / 20.0));
is->audio_volume = av_clip(is->audio_volume == new_volume ? (is->audio_volume + sign) : new_volume, 0, SDL_MIX_MAXVOLUME);

二、进入SDL的音频播放回调函数 sdl_audio_callback

进入 void sdl_audio_callback(void *opaque, Uint8 *stream, int len)函数

if (!is->muted && is->audio_buf && is->audio_volume == SDL_MIX_MAXVOLUME)
            memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1); //这里表示非静音,并且是最大音量的时候
else {
            memset(stream, 0, len1);   // 这里表示静音的时候,直接给0数据回调
            if (!is->muted && is->audio_buf)
                 SDL_MixAudioFormat(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, AUDIO_S16SYS, len1, is->audio_volume);//这里表示有音量调节,需要调用此函数重新混合数据
}

 

总结

上面是音频音量控制的代码分享。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值