#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资源
}
(二) fmod 音频变声
最新推荐文章于 2024-05-11 09:30:20 发布