日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

08.Eclipse下Ndk开发(使用fmod实现QQ变声功能)

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 08.Eclipse下Ndk开发(使用fmod实现QQ变声功能) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(創建于2017/12/30)

1.編寫native

package org.fmod.example;public class EffectUtils {//音效的類型public static final int MODE_NORMAL = 0;public static final int MODE_LUOLI = 1;public static final int MODE_DASHU = 2;public static final int MODE_JINGSONG = 3;public static final int MODE_GAOGUAI = 4;public static final int MODE_KONGLING = 5;/*** 音效處理* @param path* @param type*/public native static void fix(String path,int type);static{System.loadLibrary("fmodL");System.loadLibrary("fmod");System.loadLibrary("qq_voice");} }

2.進入src目錄下,使用命令行生成頭文件

javah 包名+類名

3.創建項目根目錄下jni文件夾,將頭文件拷貝進去
4.下載fmod源碼,復制api中lowlevel中的inc中的頭文件到jni目錄下
5.復制fmod jar包到根目錄下libs文件夾并添加依賴
6.復制需要的api平臺的so文件到jni目錄下
7.修改報錯的地方,比如頭文件的路徑等問題
8.Android Tools -> Add native support 添加本地支持(在此之前,確認你的項目中已經配置了ndk相關的頭文件目錄支持,參考前邊的筆記),填寫你要生成的
so庫的文件名,確認和loadLibrary中加載的(如qq_voice)保持一致
9.配置mk文件:
Android.mk

LOCAL_PATH := $(call my-dir)//編譯libfmod.so include $(CLEAR_VARS) LOCAL_MODULE := fmod LOCAL_SRC_FILES := libfmod.so include $(PREBUILT_SHARED_LIBRARY)//編譯libfmodL.so include $(CLEAR_VARS) LOCAL_MODULE := fmodL LOCAL_SRC_FILES := libfmodL.so include $(PREBUILT_SHARED_LIBRARY)//編譯我們自己寫的c代碼為so文件,并添加上邊編譯的so支持 include $(CLEAR_VARS) LOCAL_MODULE := qq_voice LOCAL_SRC_FILES := effect_fix.cpp LOCAL_SHARED_LIBRARIES := fmod fmodL //添加log支持 LOCAL_LDLIBS := -llog //添加c++異常類支持 LOCAL_CPP_FEATURES := exceptions include $(BUILD_SHARED_LIBRARY)

Application.mk

##支持C++異常處理,標準莫板塊(針對string.h等頭文件的處理,去掉了common.c之后,這個不再需要了,但是保留也沒問題) APP_STL := gnustl_static

10.不斷的build project,直到所有異常解決編譯成功

部分源碼:
effect_fix.cpp

#include "org_fmod_example_EffectUtils.h" #include "inc/fmod.hpp" #include <stdlib.h> #include <unistd.h> #include <android/log.h> #define LOGI(FORMAT,...) __android_log_print(ANDROID_LOG_INFO,"renzhenming",FORMAT,##__VA_ARGS__) #define LOGE(FORMAT,...) __android_log_print(ANDROID_LOG_ERROR,"renzhenming",FORMAT,##__VA_ARGS__)#define MODE_NORMAL 0 #define MODE_LUOLI 1 #define MODE_DASHU 2 #define MODE_JINGSONG 3 #define MODE_GAOGUAI 4 #define MODE_KONGLING 5using namespace FMOD;JNIEXPORT void JNICALL Java_org_fmod_example_EffectUtils_fix(JNIEnv *env, jclass jcls, jstring path_jstr, jint type){System *system;FMOD_RESULT result;Sound *sound;Channel *channel;DSP *dsp;float frequency = 0;bool isPlaying = true;const char *media_path = env->GetStringUTFChars(path_jstr,NULL);try {//初始化result = System_Create(&system);result = system->init(32, FMOD_INIT_NORMAL, NULL);//創建聲音//這里進坑了,寫作下邊的樣子是無法播放的,正確的方式是第二行 因為sound如果是null,那么,播放的時候的sound也就是null,怎么播放呢//result = system->createSound(media_path, FMOD_DEFAULT, 0, NULL);LOGI("%s",media_path);system->createSound(media_path, FMOD_DEFAULT, NULL, &sound);switch(type){case MODE_NORMAL://原生播放result = system->playSound(sound, 0, false, &channel);break;case MODE_LUOLI://dsp -- 音效//FMOD_DSP_TYPE_PITCHSHIFT 提升或者降低音調用的一種音效system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);//設置音調的參數dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,2);//播放(播放和添加channel的順序必須是先播放,再添加,否則音效無法生效)//猜測原因//playSound之后并不是立即播放,而是在system->update();之后開始播放,//playSound的作用是創造了一個sound載體一個channel載體,然后在這個載體基礎上添加一系列的效果,所以,只能現有載體//效果才有放置的位置,所以需要先play再添加result = system->playSound(sound, 0, false, &channel);//添加到channelchannel->addDSP(0,dsp);break;case MODE_DASHU://dsp -- 音效//FMOD_DSP_TYPE_PITCHSHIFT 提升或者降低音調用的一種音效system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);//設置音調的參數dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,0.6);//播放(播放和添加channel的順序必須是先播放,再添加,否則音效無法生效)result = system->playSound(sound, 0, false, &channel);//添加到channelchannel->addDSP(0,dsp);break;case MODE_GAOGUAI://提高說話的速度result = system->playSound(sound, 0, false, &channel);channel->getFrequency(&frequency);\frequency = frequency*1.5;channel->setFrequency(frequency);break;case MODE_KONGLING:system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp);dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY,300);dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK,2);result = system->playSound(sound, 0, false, &channel);channel->addDSP(0,dsp);break;case MODE_JINGSONG://緊張system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp);dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW,0.5);result = system->playSound(sound, 0, false, &channel);channel->addDSP(0,dsp);break;default:break;}while(isPlaying){channel->isPlaying(&isPlaying);//<unistd.h>//單位微秒,不斷的睡眠保證聲音播放完成之后再釋放資源usleep(1000*1000);}LOGI("%s","播放完成");system->update();} catch(...){LOGE("%s","發生異常");goto end;}goto end;end:env->ReleaseStringUTFChars(path_jstr,media_path);result = sound->release();system->close();system->release(); }

QQActivity.java

package org.fmod.example;import java.io.File;import com.renzhenming.qq_voice.R;import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View;public class QQActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);org.fmod.FMOD.init(this);setContentView(R.layout.activity_main);}public void mFix(View view){String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separatorChar + "singing.wav";Log.d("renzhenming", path);switch (view.getId()) {case R.id.btn_record:EffectUtils.fix(path, EffectUtils.MODE_NORMAL);Log.d("renzhenming", "MODE_NORMAL");break;case R.id.btn_luoli:EffectUtils.fix(path, EffectUtils.MODE_LUOLI);Log.d("renzhenming", "MODE_LUOLI");break;case R.id.btn_dashu:EffectUtils.fix(path, EffectUtils.MODE_DASHU);Log.d("renzhenming", "MODE_DASHU");break;case R.id.btn_jingsong:EffectUtils.fix(path, EffectUtils.MODE_JINGSONG);break; case R.id.btn_gaoguai:EffectUtils.fix(path, EffectUtils.MODE_GAOGUAI);break; case R.id.btn_kongling:EffectUtils.fix(path, EffectUtils.MODE_KONGLING);break; default:break;}}@Overrideprotected void onDestroy(){ org.fmod.FMOD.close(); super.onDestroy();} }

EffectUtils.java

package org.fmod.example;public class EffectUtils {//音效的類型public static final int MODE_NORMAL = 0;public static final int MODE_LUOLI = 1;public static final int MODE_DASHU = 2;public static final int MODE_JINGSONG = 3;public static final int MODE_GAOGUAI = 4;public static final int MODE_KONGLING = 5;/*** 音效處理* @param path* @param type*/public native static void fix(String path,int type);static{System.loadLibrary("fmodL");System.loadLibrary("fmod");System.loadLibrary("qq_voice");} }

程序運行界面


18404062.png

總結

以上是生活随笔為你收集整理的08.Eclipse下Ndk开发(使用fmod实现QQ变声功能)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。