概述
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);//这里表示有音量调节,需要调用此函数重新混合数据
}
总结
上面是音频音量控制的代码分享。
最后
以上就是健壮康乃馨为你收集整理的ffplay 控制音量的代码实现ffplay音频音量控制的代码一、音量的大小调整函数二、进入SDL的音频播放回调函数 sdl_audio_callback总结的全部内容,希望文章能够帮你解决ffplay 控制音量的代码实现ffplay音频音量控制的代码一、音量的大小调整函数二、进入SDL的音频播放回调函数 sdl_audio_callback总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复