Fmod学习3将音频文件变音播放

news/2024/10/22 16:46:09/

本文在FMOD学习2基础

简介:本次变音大量借鉴 xxx学院的教学 。我这里做下笔记
参考官方demo:effects.cpp dsp_effect_per_speaker.cpp

这里的代码是基于FMOD1的代码

MainActivity

package com.example.fmy.selfplaymusic;import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("native-lib");}//当前对象Context mContext;//要播放的音乐文件地址public static final String  music_path = "file:///android_asset/te.mp3";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//当前对象this.mContext = this;//初始化FMODorg.fmod.FMOD.init(this);}@Overrideprotected void onDestroy() {super.onDestroy();//同步FMOD的生命周期org.fmod.FMOD.close();}//调用fmod去播放音乐public native void playsMusic(String music_path);//点击按钮触发jni方法播放音乐public void onClick(View view) {//播放音乐playsMusic(music_path);}public native  void  effects(int flag);public void onClick2(View view) {TextView t = (TextView) view;String flag =t.getText().toString();//变音switch (flag) {case "萝莉":effects(1);break;case "惊悚":effects(2);case "大叔":effects(3);break;case "搞怪":effects(4);case "空灵":effects(5);break;}}
}

对应布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.fmy.selfplaymusic.MainActivity"><Button
        android:id="@+id/sample_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点击播放音乐"android:onClick="onClick"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><LinearLayout
        android:layout_width="match_parent"android:orientation="horizontal"android:layout_height="wrap_content"><Button
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="萝莉"android:onClick="onClick2"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Button
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="惊悚"android:onClick="onClick2"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Button
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="大叔"android:onClick="onClick2"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><Button
            android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="搞怪"android:onClick="onClick2"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></LinearLayout><Button
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="空灵"android:onClick="onClick2"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>

视图

这里写图片描述

Jni实现类

#include <jni.h>#include <iostream>
#include <fmod.hpp>
#include <unistd.h>
//变音
extern  "C"
JNIEXPORT void JNICALL
Java_com_example_fmy_selfplaymusic_MainActivity_effects(JNIEnv *env, jobject instance, jint flag) {//音频地址char * rawPath = "file:///android_asset/te.mp3";//FMOD系统对象FMOD::System       *system         = 0;//音效FMOD::Sound        *sound          = 0;//声轨FMOD::Channel       *channel       = 0;//声轨集合FMOD::ChannelGroup  * mastergroup  = 0;//一个数字信号处理单元FMOD::DSP            *dsp        = 0;//创建对象FMOD::System_Create(&system);//初始化 系统对象最大声轨为32system->init(32,FMOD_INIT_NORMAL,0);//加载声音 如果过大建议你用FMOD_CREATESTREAM 标志system->createSound(rawPath,FMOD_DEFAULT,0,&sound);//得到声音轨道集合system->getMasterChannelGroup(&mastergroup);//播放音乐system->playSound(sound,0,false,&channel);switch (flag){//萝莉case 1://创建音频处理DSP 类型 为音频提高system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);//设置dsp大小dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,2.0);//添加一个处理单元到通道channel->addDSP(0,dsp);break;//惊悚case 2://创建音频处理DSP 类型 为颤抖system->createDSPByType(FMOD_DSP_TYPE_TREMOLO,&dsp);//设置低频震旦器频率dsp->setParameterFloat(FMOD_DSP_TREMOLO_FREQUENCY,20);//设置声音歪斜dsp->setParameterFloat(FMOD_DSP_TREMOLO_SKEW,0.5);//添加一个处理单元到通道channel->addDSP(0,dsp);break;//大叔case 3://创建音频处理DSP 类型 为音频提高system->createDSPByType(FMOD_DSP_TYPE_PITCHSHIFT,&dsp);//设置dsp大小dsp->setParameterFloat(FMOD_DSP_PITCHSHIFT_PITCH,0.5);//添加一个处理单元到通道channel->addDSP(0,dsp);break;//搞怪case 4:{float mfrequency = 0;//得到频率channel->getFrequency(&mfrequency);channel->setFrequency(mfrequency*2);break;}//空灵case 5 :{//创建音频处理DSP 类型 为音频提高system->createDSPByType(FMOD_DSP_TYPE_ECHO,&dsp);//设置dsp大小  延迟声dsp->setParameterFloat(FMOD_DSP_ECHO_DELAY,300);//回音音量dsp->setParameterFloat(FMOD_DSP_ECHO_FEEDBACK,20);//添加一个处理单元到通道channel->addDSP(0,dsp);break;}}}using namespace std;
extern  "C"
点击按钮播放音乐
JNIEXPORT void JNICALL
Java_com_example_fmy_selfplaymusic_MainActivity_playsMusic(JNIEnv *env, jobject instance,jstring music_path_) {//得到音乐文件地址const char *music_path = env->GetStringUTFChars( music_path_, 0);//FMOD系统对象FMOD::System       *system         = 0;//音效FMOD::Sound        *sound          = 0;//声轨FMOD::Channel       *channel       = 0;//创建对象FMOD::System_Create(&system);//初始化 系统对象最大声轨为32system->init(32,FMOD_INIT_NORMAL,0);//加载声音 如果过大建议你用FMOD_CREATESTREAM 标志system->createSound(music_path,FMOD_DEFAULT,0,&sound);//播放音乐system->playSound(sound,0, false,&channel);//开启更新通道 官方demo写了 但是我我发现不写也没事system->update();//保存声音时间unsigned int duration  =  0;//得到声音sound->getLength(&duration,FMOD_TIMEUNIT_MS);//线程休眠 以微妙 所以要转usleep(duration*1000);//释放资源sound->release();system->close();system->release();env->ReleaseStringUTFChars(music_path_, music_path);}

解释:
上面的代码大致就分为几种添加
1. createDSPByType 创建一个dsp类型(数字信号处理的一个单元)
2. 设定dsp类型数值

dsp类型有如下类型

FMOD_DSP_TYPE_UNKNOWN,/ *本机是通过非FMOD插件创建的,因此目的不明。 * /FMOD_DSP_TYPE_MIXER,/ *本机不需要任何输入,并将它们混合在一起,然后将结果提供给声卡单元。 * /FMOD_DSP_TYPE_OSCILLATOR,/ *本机产生正弦/平方//三角形或噪声音。 * /FMOD_DSP_TYPE_LOWPASS,/ *该单元使用高质量的谐振低通滤波器算法对声音进行滤波,但消耗更多的CPU时间。 * /FMOD_DSP_TYPE_ITLOWPASS,/ *本机使用脉冲跟踪器中使用的谐振低通滤波器算法对其进行滤波,但截止频率有限(08060hz)。 * /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,/ *本机允许使用Steinberg VST插件* /FMOD_DSP_TYPE_WINAMPPLUGIN,/ *本机允许使用Nullsoft Winamp插件* /FMOD_DSP_TYPE_ITECHO,/ *本机在声音上产生回声,并按照脉冲跟踪器中使用的所需速度淡出。 * /FMOD_DSP_TYPE_COMPRESSOR,/ *本机实现动态压缩(链接/非链接多通道,宽带)* /FMOD_DSP_TYPE_SFXREVERB,/ *本机实现SFX混响* /FMOD_DSP_TYPE_LOWPASS_SIMPLE,/ *本机使用无共振的简单低通滤波声音,但具有灵活的截止频率,速度快。 * /FMOD_DSP_TYPE_DELAY,/ *本机在声道的各个通道上产生不同的延迟。 * /FMOD_DSP_TYPE_TREMOLO,/ *本机对声音产生颤音/斩波效果。 * /FMOD_DSP_TYPE_LADSPAPLUGIN,/ *不支持/已弃用。 * /FMOD_DSP_TYPE_SEND,/ *本机将DSP信号的任何地方的信号复制到返回DSP。 * /FMOD_DSP_TYPE_RETURN,/ *本机从多个发送DSP接收信号。 * /FMOD_DSP_TYPE_HIGHPASS_SIMPLE,/ *此单元使用简单的高通,无谐振过滤声音,但具有灵活的截止和快速。 * /FMOD_DSP_TYPE_PAN,/ *该单元平移信号,也可能上混合或下混合。 * /FMOD_DSP_TYPE_THREE_EQ,/ *本机是三频均衡器。 * /FMOD_DSP_TYPE_FFT,/ *本机简单分析信号,并通过getParameter提供频谱信息。 * /FMOD_DSP_TYPE_LOUDNESS_METER,/ *本机分析信号的响度和真峰值。 * /FMOD_DSP_TYPE_ENVELOPEFOLLOWER,/ *本机跟踪输入/侧链信号的包络。格式即将公开披露。 * /FMOD_DSP_TYPE_CONVOLUTIONREVERB,/ *本机实现卷积混响。 * /FMOD_DSP_TYPE_CHANNELMIX,/ *该单元提供每个信号通道增益,并输出通道映射,以允许由多组信号组成的1个多通道信号映射到单个输出信号。 * /FMOD_DSP_TYPE_TRANSCEIVER,/ *本机从多达32个不同插槽的选择中发送和接收。它就像发送/返回,但它使用全局插槽而不是返回作为目标。它还具有其他功能。多个收发器可以从单个信道接收,或者多个收发器可以发送到单个信道,或两者的组合。 * /FMOD_DSP_TYPE_OBJECTPAN,/ *本机将信号发送到像Dolby Atmos这样的3d对象编码器。支持FMOD_DSP_TYPE_PAN参数的一个子集。 * /FMOD_DSP_TYPE_MAX,/ *预定义DSP类型的最大数量。 * /FMOD_DSP_TYPE_FORCEINT = 65536 / *确保此枚举已签名32位。 * /

对应的可以设置的值的枚举类型把TYPE去掉搜索即可看到。
FMOD_DSP_TYPE_PITCHSHIFT
对应的可以设置的数值查找
FMOD_DSP_PITCHSHIF就可以看到


http://www.ppmy.cn/news/567210.html

相关文章

如何使Winamp看起来像iTunes

Winamp is a terrific, customizable media player that keeps getting better with each new release. If you are tired of the default skins included with it, then join us as we show you how to make Winamp look like iTunes. Winamp是一个了不起的&#xff0c;可自定…

winamp 5.55下载_免费下载:Winamp 5.8 Beta已正式发布,现在对Llama友好

winamp 5.55下载 The tech world got really excited the other day with the news that Winamp was supposedly returning with an all-new version that would solve all of our music-listening problems. And now the official Winamp 5.8 is available for download. Grea…

winamp 珍藏_Winamp 6可能不是汽配并且可能在2019年到货(可能)

winamp 珍藏 Llama Llama, red pajama, reads a story with his mama… and according to this story in Techcrunch today, Winamp might be coming back next year as version 6—but just like this paragraph, it doesn’t make any sense. Llama红色睡衣的Llama和他的妈妈…

Winamp v5.6.6.3516

说是最后一版&#xff0c;如今还有多少人记得它&#xff1f;下载&#xff1a;http://download.nullsoft.com/winamp/client/winamp5666_full_all.exe【特别信息】Name: ThumperDC Key: 1C52M-TVS6H-O3JBZ-QD49EName: ThumperTM Key: 6U74J-TSCCX-172KP-W4NFDName: ThumperDC.CO…

winamp 珍藏_Winamp发生了什么,您现在可以使用吗?

winamp 珍藏 () Twenty years ago Winamp was the future. Now it’s a distant memory. What happened? 二十年前&#xff0c;Winamp是未来。 现在是遥远的记忆。 发生了什么&#xff1f; Winamp (Windows Advanced Multimedia Products) came out on April 21, 1997—back …

一代传奇!经典播放器 Winamp 的开源实现

【导语】&#xff1a;Winamp 是一个超级经典的音频播放器&#xff0c;诞生于 1997 年。它随着 MP3 共享文件的繁荣而迅速走红&#xff0c;如今已经名存实亡了。 用过 Winamp 这个软件的人中&#xff0c;80 后应该居多。 Winamp 有很多插件&#xff0c;比如&#xff1a;Winamp…

HTML5实现Winamp2.9音频播放器插件

Winamp2-js是一款使用 html5和javascript来实现Winamp 2.9 音频播放器的插件。该Winamp音频播放器插件有支持拖拽文件&#xff0c;自定义皮肤&#xff0c;支持可视化模式等特点。特点还有&#xff1a; 实际的Winamp皮肤文件存储在本地计算机上&#xff0c;你可以任意调用自己…

HTML5实现的经典播放器Winamp

什么是 Winamp &#xff1f; Winamp是数字媒体播放的先驱&#xff0c;由Nullsoft公司在1997年开发&#xff0c;创始人Justin Frankel&#xff0c;该软件支持MP3&#xff0c; MP2&#xff0c; MOD&#xff0c; S3M&#xff0c; MTM&#xff0c; ULT&#xff0c;XM&#xff0c; I…