(二) fmod 音频变声

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanghuangjin/article/details/82768564
#include "hjcommon.hpp"
#include "./inc/fmod.hpp"
#include "examples/common.h"
#include <unistd.h>

using namespace FMOD;

static const int EFFECTS_NORMAL = 0; // 原声
static const int EFFECTS_LUOLI = 1; // 萝莉
static const int EFFECTS_DASHU = 2; // 大叔
static const int EFFECTS_JINGSONG = 3; // 惊悚
static const int EFFECTS_GAOGUAI = 4; // 搞怪
static const int EFFECTS_KONGLING = 5; // 空灵

JNIEXPORT void JNICALL Java_hankin_hjmedia_ff_fmod_AudioEffectsActivity_fix(JNIEnv *env, jobject thiz, jstring audioPath_, jint type_) // 音频特效处理,type为特效种类
{
    char audioPath[128];
    hjcpyJstr2char(env, audioPath_, audioPath);

    System * system = 0;
    Sound * sound = 0;
    Channel * channel = 0;
    DSP * dsp = 0; // digital signal process  数字信号处理
    bool isPlaying = true;
    float frequency = 0;

    System_Create(&system); // 创建 System
    system->init(32, FMOD_INIT_NORMAL, 0); // 初始化,参数:通道数(每一个声音占一个通道,然后通过混音将各通道的声音混合在一起播放)、FMOD_INIT_NORMAL、额外的数据
    system->createSound(audioPath, FMOD_DEFAULT, 0, &sound);// 创建声音,参数:音频路径、模式、额外信息、创建的声音的对象
    system->playSound(sound, 0, false, &channel); // 播放声音,声音占用 channel
    switch (type_) {
        case EFFECTS_NORMAL: // 原声
            break;
        case EFFECTS_LUOLI: // 萝莉 音调高
            system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp); // 创建DSP,FMOD_DSP_TYPE_PITCHSHIFT 表示提高或降低音调,声音波由振幅(响度)与频率(音调)组成
            dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 1.5); // 设置音调,FMOD_DSP_PITCHSHIFT_PITCH 2.0 表示音调升高一个8度
            channel->addDSP(0, dsp); // 将音效添加到声音,同一个声音(channel)上可以添加多个音效,参数:音效下标,音效
            break;
        case EFFECTS_DASHU: // 大叔 音调低
            system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT, &dsp);
            dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH, 0.8); // 萝莉的音调较高,大叔的音调低沉
            channel->addDSP(0, dsp);
            break;
        case EFFECTS_JINGSONG: // 惊悚 紧张,声音会颤抖
            system->createDSPByType(FMOD_DSP_TYPE_TREMOLO, &dsp); // FMOD_DSP_TYPE_TREMOLO 表示颤抖
            dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW, 0.5); // FMOD_DSP_TREMOLO_SKEW 表示扭曲 ,更多的这些参数,或者DSP的type 可参看源码注释
            channel->addDSP(0, dsp);
            break;
        case EFFECTS_GAOGUAI: // 搞怪 提高语速
            channel->getFrequency(&frequency); // 获取音频播放速度
            frequency *= 1.8;
            channel->setFrequency(frequency); // 设置音频播放速度
            break;
        case EFFECTS_KONGLING: // 空灵 有回音
            system->createDSPByType(FMOD_DSP_TYPE_ECHO, &dsp); // FMOD_DSP_TYPE_ECHO 表示回音
            dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY, 300); // FMOD_DSP_ECHO_DELAY 为 FMOD_DSP_TYPE_ECHO 的参数,表示延时(回音的时间?) 单位毫秒?
            dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK, 20); // FMOD_DSP_ECHO_FEEDBACK 表示回音的次数
            channel->addDSP(0, dsp);
            break;
    }

    system->update(); // 更新,不更新无法播放
    while (isPlaying)
    {
        channel->isPlaying(&isPlaying);
        usleep(1*1000*1000); // linux线程休眠函数,参数单位微秒   unistd.h 中
    }

    sound->release(); // 释放声音资源
    system->close(); // 关闭system
    system->release(); // 释放system资源
}

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/82768564