尾声
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
} catch (…) {
LOGE(“%s”, “catch exception…”)
goto end;
}
// system->update();
// 每隔一秒检测是否播放结束
while (isPlaying) {
channel->isPlaying(&isPlaying);
usleep(1000 * 1000);
}
goto end;
//释放资源
end:
env->ReleaseStringUTFChars(path_jstr, path_cstr);
sound->release();
system->close();
system->release();
}
调用流程
-
首先创建System ,再做System初始化
-
createDSPByType(创建数字信号模拟器) 来看下都能实现什么音响效果
有兴趣的小伙伴可以通过传入不同的type和参数来尝试
typedef enum
{
FMOD_DSP_TYPE_UNKNOWN,
FMOD_DSP_TYPE_MIXER, //混合输入。
FMOD_DSP_TYPE_OSCILLATOR, //生成正弦/正方形/锯齿/三角形或噪声音调。
FMOD_DSP_TYPE_LOWPASS,
FMOD_DSP_TYPE_ITLOWPASS,
FMOD_DSP_TYPE_HIGHPASS,
FMOD_DSP_TYPE_ECHO, //在声音上产生回声,并以所需的速率衰减。
FMOD_DSP_TYPE_FADER,
FMOD_DSP_TYPE_FLANGE, //对声音产生法兰效应。
FMOD_DSP_TYPE_DISTORTION,
FMOD_DSP_TYPE_NORMALIZE,
FMOD_DSP_TYPE_LIMITER,
FMOD_DSP_TYPE_PARAMEQ,
FMOD_DSP_TYPE_PITCHSHIFT,
FMOD_DSP_TYPE_CHORUS, //在声音上产生一种合唱效果。
FMOD_DSP_TYPE_VSTPLUGIN,
FMOD_DSP_TYPE_WINAMPPLUGIN,
FMOD_DSP_TYPE_ITECHO,
FMOD_DSP_TYPE_COMPRESSOR,
FMOD_DSP_TYPE_SFXREVERB, //自解压混响
FMOD_DSP_TYPE_LOWPASS_SIMPLE,
FMOD_DSP_TYPE_DELAY,
FMOD_DSP_TYPE_TREMOLO, //在声音上产生一种颤音/斩波的效果。
FMOD_DSP_TYPE_LADSPAPLUGIN,
FMOD_DSP_TYPE_SEND,
FMOD_DSP_TYPE_RETURN,
FMOD_DSP_TYPE_HIGHPASS_SIMPLE,
FMOD_DSP_TYPE_PAN,
FMOD_DSP_TYPE_THREE_EQ, //三波段均衡器。
FMOD_DSP_TYPE_FFT,
FMOD_DSP_TYPE_LOUDNESS_METER,
FMOD_DSP_TYPE_ENVELOPEFOLLOWER,
FMOD_DSP_TYPE_CONVOLUTIONREVERB, //卷积混响。
FMOD_DSP_TYPE_CHANNELMIX,
FMOD_DSP_TYPE_TRANSCEIVER,
FMOD_DSP_TYPE_OBJECTPAN,
FMOD_DSP_TYPE_MULTIBAND_EQ,
FMOD_DSP_TYPE_MAX,
FMOD_DSP_TYPE_FORCEINT = 65536 /* Makes sure this enum is signed 32bit. */
} FMOD_DSP_TYPE;
- system->playSound(sound, 0, false, &channel); channel->addDSP(0, dsp);
播放声音
3.2.2 fmod Reverb3D(混响3D) 3D声音和空间化
有玩过csgo的小伙伴,或者一些射击类游戏,一些技术厉害的玩家都比较喜欢带耳机,通过声音来辨别对手的位置。
FMOD Core API支持多种功能,这些功能允许将声音放置在3D空间中,从而通过平移,多普勒音高移位以及通过音量缩放甚至是特殊滤波进行衰减,使声音作为环境的一部分在听众周围移动。
FMOD 3D空间化功能:
-
多个衰减衰减模型
滚降是声音在靠近听众或远离听众时的音量行为。在线性,反向,线性平方,反向锥形和自定义滚降模式之间进行选择。自定义滚降允许设置FMOD_3D_ROLLOFF_CALLBACK以允许用户计算音量滚降的方式。如果回调不方便,则FMOD还允许使用ChannelControl :: set3DCustomRolloff在其间线性内插的点数组表示“曲线” 。 -
多普勒音调移位
由收听者和通道或通道组的用户速度设置控制的准确音高偏移是由FMOD 3D空间化系统实时计算和设置的。 -
基于矢量的振幅平移(VBAP)
该系统实时平移用户扬声器中的声音,支持单声道,立体声,高达5.1和7.1环绕声扬声器设置。 -
咬合
通道或通道组可以应用低通滤波,以模拟声音穿过墙壁或被大型物体遮挡。 -
3D混响区用于混响平移
混响也可以被遮挡,以免穿过墙壁或物体。 -
基于多边形的几何遮挡
将多边形数据添加到FMOD的几何引擎中,FMOD将使用光线投射实时自动遮挡声音。有关更多信息,请参见基于3D多边形的几何遮挡部分。 -
多个听众
在分屏模式的游戏中,FMOD可以为每个玩家支持一个听众,以便3D声音正确衰减。 -
在多声道声音的2D和3D之间变形
声音可以是点源,也可以由用户变形为2D声音,这对于基于距离的包络非常有用。声音越近,它越能传播到其他扬声器中,而不是随着声音从一侧平移到另一侧而从一侧翻转到另一侧。有关允许用户更改此混合的功能,请参见ChannelControl :: set3DLevel。 -
立体声和多声道声音可以是3D
通常,单声道声音用于3D音频。多声道声音可以用来产生额外的影响。默认情况下,多声道声音会折叠为单点源。要“传播”多声道声音的声道,请使用ChannelControl :: set3DSpread。对于从某个方向发出的声音,这可以带来更大的空间效果。声音在远处的细微散布可能会给人留下更有效的空间感觉,就好像它是从附近的表面反射出来的一样,或者是“大”的声音并在不同方向上发出不同的声音。 -
空间化插件支持
第三方VR音频插件可用于在耳机上提供更逼真的平移。
3.2.2.1 3D实现
在创建的声音时需要改成3D,以及距离的相关参数
System_Create(&system);
system->init(32, FMOD_INIT_NORMAL, NULL);
const char *path_cstr = env->GetStringUTFChars(path_jstr, NULL);
FMOD_VECTOR pos = { -10.0f, 0.0f, 0.0f };
Reverb3D *reverb;
FMOD_RESULT result = system->createReverb3D(&reverb);
LOGI(“createReverb3D %c”, result);
FMOD_REVERB_PROPERTIES prop2 = FMOD_PRESET_CONCERTHALL;
reverb->setProperties(&prop2);
float mindist = 10.0f;
float maxdist = 20.0f;
FMOD_VECTOR listenerpos = { 10.0f, 5.0f, -1.0f };
system->set3DListenerAttributes(0, &listenerpos, 0, 0, 0);
system->createSound(path_cstr, FMOD_3D, NULL, &sound);
system->playSound(sound, 0, false, &channel);
4、SoundTouch使用
SoundTouch用于更改音频流或音频文件的速度,音调和播放速率。
- 速度 (时间拉伸):更改声音以比原始速度更快或更慢的速度播放,而不影响音高。
- 音高(音调):在保持原始速度(速度)的同时改变音高或音调。
- 播放速率:一起改变速度和音高,就好像以不同的RPM速率播放黑胶唱片一样。
4.1相关配置
-
下载源码
sound源码下载 -
分配拷贝C++ 和 jni代码 包括 soundtouch-jni.cpp 、SoundTouch.java
这边拷贝android相关
这边需要修改jni相关的包名和类名 以及引入so库的名字
- cmake脚本
cmake_minimum_required(VERSION 3.4.1)
include_directories (“src/main/cpp/include”)
add_library( # Sets the name of the library.
soundtouch-lib
Sets the library as a shared library.
SHARED
Provides a relative path to your source file(s).
src/main/cpp/soundtouch-jni.cpp
src/main/cpp/SoundTouch/AAFilter.cpp
src/main/cpp/SoundTouch/BPMDetect.cpp
src/main/cpp/SoundTouch/cpu_detect_x86.cpp
src/main/cpp/SoundTouch/FIFOSampleBuffer.cpp
src/main/cpp/SoundTouch/FIRFilter.cpp
src/main/cpp/SoundTouch/InterpolateCubic.cpp
src/main/cpp/SoundTouch/InterpolateLinear.cpp
src/main/cpp/SoundTouch/InterpolateShannon.cpp
src/main/cpp/SoundTouch/mmx_optimized.cpp
src/main/cpp/SoundTouch/PeakFinder.cpp
src/main/cpp/SoundTouch/RateTransposer.cpp
src/main/cpp/SoundTouch/SoundTouch.cpp
src/main/cpp/SoundTouch/sse_optimized.cpp
src/main/cpp/SoundTouch/TDStretch.cpp
src/main/cpp/SoundStretch/WavFile.cpp
)
find_library( # Sets the name of the path variable.
log-lib
Specifies the name of the NDK library that
you want CMake to locate.
log )
target_link_libraries( # Specifies the target library.
soundtouch-lib
Links the target library to the log library
included in the NDK.
${log-lib} )
4.2 调用soundTouch 相关功能
这边举个例子,看下如何调用SoundTouch的函数
- jni部分
extern “C” DLL_PUBLIC jstring Java_com_hugh_sound_SoundTouch_getVersionString(JNIEnv *env, jobject thiz)
{
const char *verStr;
LOGV(“JNI call SoundTouch.getVersionString”);
// Call example SoundTouch routine
verStr = SoundTouch::getVersionString();
/// gomp_tls storage bug workaround - see comments in _init_threading() function!
_init_threading(false);
int threads = 0;
#pragma omp parallel
{
#pragma omp atomic
threads ++;
}
LOGV(“JNI thread count %d”, threads);
// return version as string
return env->NewStringUTF(verStr);
}
- java 部分
public native final static String getVersionString();
Log.e(“aaa”,“version:”+SoundTouch.getVersionString());
- 具体可以参考代码里具体代码实现
SoundTouch 功能
处理.wav 音频文件
广泛的调整参数范围:
速度和播放率可在-95%… + 5000%范围内调节
声音音高(键) 在范围内可调-60 … 60个半音(+ - 5个八度)。
每秒节拍(BPM)检测可以调整速度以与所需的BPM速率匹配。
5、小结
SoundTouch 与 FMOD 对比
- SoundTouch
优点:开源,并且用于改变音频流或音频文件的节奏、音调和播放速率。适合一些简单音频处理
缺点:功能单一,满足不了需求。
- FMOD
优点:声音处理功能强大,可以方便的对声音进行处理。
缺点:非开源,商用不免费,定制化差。
6、参考资料
https://www.jianshu.com/p/50ca2118db92
参考原作:https://blog.csdn.net/qq_38366777/article/details/107405903
题外话
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊
这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
欢迎评论区讨论。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
的情况下面试能够顺利一点,希望可以帮助到大家~
[外链图片转存中…(img-k8dPz5sw-1715683145379)]
欢迎评论区讨论。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!