我是靠谱客的博主 健壮康乃馨,最近开发中收集的这篇文章主要介绍ffplay 控制音量的代码实现ffplay音频音量控制的代码一、音量的大小调整函数二、进入SDL的音频播放回调函数 sdl_audio_callback总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部