当前位置: 首页 > 面试题库 >

如何在音频均衡器中添加立体声,高音选项?

余善
2023-03-14
问题内容

我正在尝试使用小型音频歌曲均衡器。我想在其中添加
高音,立体声等选项,就像在Poweramp播放器中一样。

Poweramp音乐播放器的图像

我成功实现了5个频段的均衡器,如下所示:

public class FragmentEqualizer extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        equalizer = new EQ(getActivity(), new Equalizer(0,com.androidhive.musicplayer.AndroidBuildingMusicPlayerActivity.mp.getAudioSessionId()));
       for(Bar bar : eqBars)
            bar.setActiveEQ();
       maximum= EQ.getEqualizer().getBandLevelRange()[1];
       minimum= EQ.getEqualizer().getBandLevelRange()[0];
    }


public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);


                   lvforprest.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                            @Override
                                    public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                                btnformenu.setText(gtuforpresets.get(position).gtumcaFirstName);
                                if(position!=0 && position <=10)
                                {
                                    try
                                    {
                                 EQ.getEqualizer().usePreset((short) (position-1));
                          EQ.getEqualizer().setBandLevel((short)0,  EQ.getEqualizer().getBandLevel((short) 0));
                          EQ.getEqualizer().setBandLevel((short)1,  EQ.getEqualizer().getBandLevel((short) 1));
                          EQ.getEqualizer().setBandLevel((short)2, EQ.getEqualizer().getBandLevel((short) 2));
                          EQ.getEqualizer().setBandLevel((short)3,  EQ.getEqualizer().getBandLevel((short) 3));
                          EQ.getEqualizer().setBandLevel((short)4,  EQ.getEqualizer().getBandLevel((short) 4));

                          eqBars.get(0).setEQPosition(EQ.getEqualizer().getBandLevel((short) 0));
                          eqBars.get(1).setEQPosition(EQ.getEqualizer().getBandLevel((short) 1));
                          eqBars.get(2).setEQPosition(EQ.getEqualizer().getBandLevel((short) 2));
                          eqBars.get(3).setEQPosition(EQ.getEqualizer().getBandLevel((short) 3));
                          eqBars.get(4).setEQPosition(EQ.getEqualizer().getBandLevel((short) 4));
                          seekbar1katop.setText(EQ.getEqualizer().getBandLevel((short) 0)+"mB");
                          seekbar2katop.setText(EQ.getEqualizer().getBandLevel((short) 1)+"mB");
                          seekbar3katop.setText(EQ.getEqualizer().getBandLevel((short) 2)+"mB");
                          seekbar4katop.setText(EQ.getEqualizer().getBandLevel((short) 3)+"mB");
                          seekbar5katop.setText(EQ.getEqualizer().getBandLevel((short) 4)+"mB");


                                 }
                                    catch(IllegalStateException e)
                                    {
                                         Toast.makeText(getActivity(),"Unable",Toast.LENGTH_SHORT).show();

                                    }
                                    catch(IllegalArgumentException e)
                                {
                                         Toast.makeText(getActivity(),"Unable",Toast.LENGTH_SHORT).show();

                                    }
                                    catch(UnsupportedOperationException e)
                                    {
                                      Toast.makeText(getActivity(),"Unable",Toast.LENGTH_SHORT).show();

                                    }
                                }

                            //    Toast.makeText(getApplicationContext(),"You Clicked : " + mEqualizer.getEnabled(),Toast.LENGTH_SHORT).show();
                             }
                        });

}
}

上面的代码只是我的均衡器代码的简短摘要。它不会像
我在此处发布的示例那样起作用。。

我也想在均衡器中添加高音,立体声,单声道效果。

我已经像这样实现了低音增强:

public static void setBassBoost(BassBoost bassBoost, int percent) {
        try{
            bassBoost.setStrength((short) ((short) 1000 / 100 * percent));
            bassBoost.setEnabled(true);
        }catch (Exception e){

        }
    }

    public static void setBassBoostOff(BassBoost bassBoost) {
        bassBoost.setEnabled(false);
    }

我使用了Inbulilt类来增强低音。

如何在应用中添加高音和立体声/单声道效果?


问题答案:

为了改变低音,中音,高音,不需要使用
该AudioTrack对象(即使使用该对象,您也只能
播放未压缩的PCM数据)。

您只需要使用您的 对象来调整适当的频段级别即可。要获取可用频段的数量,只需致电:
Equalizer

myEqualizer.getNumberOfBands()

Considering the number of available bands, you can now set the level for each
band using the following method:

myEqualizer.setBandLevel(band, level);

where:

频段:将具有新增益的频段。
频段编号从0开始,以(频段数量-1)结束。

级别:将以给定频段设置的新的千分之一增益。
getBandLevelRange()将定义最大值和最小值。

更新

要实现一个简单的平衡效果,只是区别左/右
您的播放器的音量(MediaPlayer,SoundPool,…):

mediaPlayer.setVolume(left, right)

要获得单声道效果,您可以考虑使用
Virtualizer,
它提供立体声加宽效果。您可以
使用以下方法设置虚拟化效果的强度:

virtualizer.setStrength(1000); //range is [0..1000]

您需要 仔细阅读
文档
,以检查
基础系统是否真正支持虚拟机的当前配置。

无论如何,这不是真正的单声道输出,我认为如果
不使用诸如
AudioTrack(实际上Poweramp的音频
管道依赖于本地JNI库)这样的低级API,就无法在立体声扬声器上获得单声道输出。如果你想使用的AudioTrack播放,你需要
考虑的,它仅支持PCM数据(WAV)作为输入:你会不会这个手段
能够直接,因为你玩压缩的音频文件(,…如MP3,FLAC)
需要首先手动解码压缩的音频文件。

[Compressed File (MP3)] ===> decode() ===> [PCM data] ===> customEffect() ===> AudioTrack playback()

因此,为了使用和AudioTrack播放压缩的音频(并
最终创建自定义效果),需要执行以下步骤:

  1. 使用解码器解码压缩文件(没有可用的PUBLIC SYSTEM API,您需要手动进行!!!)。
  2. 如有必要,以与AudioTrack兼容的PCM格式转换未压缩的数据
  3. (最终)将转换应用于PCM数据流(例如,您可以合并两个L / R通道并创建单声道效果)
  4. 使用AudioTrack播放PCM流
    我建议您跳过此效果;)

关于低音增强效果,您需要检查
正在运行的设备(例如虚拟器)是否支持当前配置。
看看这里为更多信息
这一点。



 类似资料:
  • 问一下Xamarin.Forms便携里面Xamarin.Forms的音频怎么播放 正如我所知,有依赖服务,我看到了一些示例,只有iOS和Android,但没有Windows Phone 8.1/Windows 8.1和UWP。

  • 我需要为Android做一个均衡器。不推荐使用El音频会话ID|0。有方法获得当前音频会话ID吗?我想从我的应用程序中均衡其他应用程序的声音。在Google play中,还有其他应用程序使用“兼容模式”。但我不知道他们是怎么做的。例如,应用程序检测到spotify正在播放,会话被选中,并且它可以被均衡。有人知道这是怎么做的吗?多谢了。 示例应用程序:

  • 问题内容: 我正在设计一个简单的调谐器,所以我的目标是显示音符名称(A,B,F#)以及理论声音和实际输入之间的 距离( 以分为单位)。 我是音频和信号处理的新手,所以我做了一些研究,发现 了一个 叫做快速傅立叶变换 的东西 ,它可以分析字节并给我频率。另外,我发现了一些Java库,例如通用数学和JTransforms,所以我不会自己编写硬代码。 我相信就这样,因为每个范围的频率都可以以相同的气质直

  • 但是我将ffmpeg更新到了最新版本(ffmpeg version git-2012-06-16-809d71d),现在在这个版本中参数不起作用。 请告诉我如何使用将新音频添加到视频(不是混合)中。

  • 问题内容: 我有几个与Sun,音频播放器和声音输入/输出有关的问题 为什么该软件包不属于Java API?此处是一些信息:http : //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6b14/sun/audio/AudioPlayer.java但这仍然是默认JDK构建I的一部分正在使用。 我已经尝试过使用JMF,

  • 问题内容: 我有一个声音文件,我想修改音高。该文件存储在MP3中。我已经搜索了互联网,但是未能找到任何可以修改音高的库或算法。 任何示例和/或文献将不胜感激 问题答案: 从您的问题中并不清楚,您是否只想更改播放速度(就像转盘上的音调衰减器一样),还是要更改音高而不影响播放速度。如果是后者,则需要使用时间拉伸/音高偏移算法。参见:http : //en.wikipedia.org/wiki/Audi