MeidaPlayer音效测试用例

本示例测试包括重低音(BassBoost)、环绕音(Virtualizer)、均衡器(Equalizer)和混响(EnvironmentalReverb),不包括视图(Visualizer),因为我发现前面4个网上都没有找到像样的用法,所以在这写篇博文。

音效起作用条件

  1. 得到audio session ID
  2. 进行初始化
  3. 使能

设置音效范围

这些数据都可以在源码里看到,在这里也列举一下

  1. BassBoost在[0,1000]范围之间
  2. Virtualizer在[0,1000]范围之间
  3. Equalizer在[-1500,1500]范围之间,存在多个Band
  4. EnvironmentalReverb在[-9000, 2000]之间

注意事项

测试时,需要只能有一个应用示例在使用MediaPlayer播放器,否则,谁先开启谁就先起作用,参数(int priority, int audioSession)里的priority没毛用

部分完整代码

部分 == 完整 ~

public class MainActivity extends AppCompatActivity implements MusicService.Callback {
    final static String TAG = MainActivity.class.getSimpleName();
    List<MediaInfo> mediaInfos;
    List<String> strings;
    MusicService musicService;
    int priority = 1;

    // 重低音
    BassBoost bassBoost;
    // 环绕音
    Virtualizer virtualizer;
    // 均衡器
    Equalizer equalizer;
    // 混响
    EnvironmentalReverb environmentalReverb;
    SeekBarListener listener;

    ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            musicService = ((MusicService.MyBinder) service).getService();
            musicService.setCallback(MainActivity.this);
            Log.d(TAG, "priority:" + priority);

            bassBoost = new BassBoost(priority, musicService.getAudioSessionId());
            bassBoost.setEnabled(true);
            Log.d(TAG, "default bassBoostStrength:" + bassBoost.getRoundedStrength());
            sb_bassBoost.setMax(1000); //[0,1000]
            sb_bassBoost.setProgress(getPreference("bassBoost"));
            bassBoost.setStrength((short) getPreference("bassBoost"));
            virtualizer = new Virtualizer(priority, musicService.getAudioSessionId());
            virtualizer.setEnabled(true);
            Log.d(TAG, "default virtualizerStrength:" + virtualizer.getRoundedStrength());
            sb_virtualizer.setMax(1000); //[0,1000]
            sb_virtualizer.setProgress(getPreference("virtualizer"));
            virtualizer.setStrength((short) getPreference("virtualizer"));
            equalizer = new Equalizer(priority, musicService.getAudioSessionId());
            equalizer.setEnabled(true);
            short[] ranges = equalizer.getBandLevelRange();
            Log.d(TAG, "ranges[0]:" + ranges[0] + ", ranges[1]:" + ranges[1]);
            for (short i = 0; i < equalizer.getNumberOfBands(); i++) {
                System.out.println("default range" + i + ":" + equalizer.getBandLevel(i));
            }
            equalizerBand0.setMax(3000); // [-1500, 1500]
            equalizerBand0.setProgress(getPreference("equalizerBand0") + 1500);
            equalizer.setBandLevel((short) 0, (short) getPreference("equalizerBand0"));
            equalizerBand1.setMax(3000); // [-1500, 1500]
            equalizerBand1.setProgress(getPreference("equalizerBand1") + 1500);
            equalizer.setBandLevel((short) 1, (short) getPreference("equalizerBand1"));
            equalizerBand2.setMax(3000); // [-1500, 1500]
            equalizerBand2.setProgress(getPreference("equalizerBand2") + 1500);
            equalizer.setBandLevel((short) 2, (short) getPreference("equalizerBand2"));
            equalizerBand3.setMax(3000); // [-1500, 1500]
            equalizerBand3.setProgress(getPreference("equalizerBand3") + 1500);
            equalizer.setBandLevel((short) 3, (short) getPreference("equalizerBand3"));
            equalizerBand4.setMax(3000); // [-1500, 1500]
            equalizerBand4.setProgress(getPreference("equalizerBand4") + 1500);
            equalizer.setBandLevel((short) 4, (short) getPreference("equalizerBand4"));
            environmentalReverb = new EnvironmentalReverb(priority, musicService.getAudioSessionId());
            environmentalReverb.setEnabled(true);
            Log.d(TAG, "default environmentalReverbReverbLevel:" + environmentalReverb.getReverbLevel());
            sb_environmentalReverb.setMax(11000); //[-9000, 2000] // setReverbLevel
            sb_environmentalReverb.setProgress(getPreference("environmentalReverb") + 9000);
            environmentalReverb.setReverbLevel((short) getPreference("environmentalReverb"));

            showDefaultEq();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            musicService = null;
        }
    };
    @Bind(R.id.spinner)
    Spinner spinner;

    private void showDefaultEq() {
        int presetNums = equalizer.getNumberOfPresets();
        String[] presetNames = new String[presetNums];
        for (short preset = 0; preset < presetNums; preset++) {
            presetNames[preset] = equalizer.getPresetName(preset);
        }

        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_spinner_dropdown_item, presetNames);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Log.d(TAG, "position:" + position);
                equalizer.usePreset((short) position);
                equalizerBand0.setProgress(equalizer.getBandLevel((short) 0) + 1500);
                equalizerBand1.setProgress(equalizer.getBandLevel((short) 1) + 1500);
                equalizerBand2.setProgress(equalizer.getBandLevel((short) 2) + 1500);
                equalizerBand3.setProgress(equalizer.getBandLevel((short) 3) + 1500);
                equalizerBand4.setProgress(equalizer.getBandLevel((short) 4) + 1500);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

        for (String s : presetNames) {
            System.out.println(s);
        }
    }

    @Bind(R.id.bassBoost)
    SeekBar sb_bassBoost;
    @Bind(R.id.virtualizer)
    SeekBar sb_virtualizer;
    @Bind(R.id.equalizer_band0)
    SeekBar equalizerBand0;
    @Bind(R.id.equalizer_band1)
    SeekBar equalizerBand1;
    @Bind(R.id.equalizer_band2)
    SeekBar equalizerBand2;
    @Bind(R.id.equalizer_band3)
    SeekBar equalizerBand3;
    @Bind(R.id.equalizer_band4)
    SeekBar equalizerBand4;
    @Bind(R.id.environmentalReverb)
    SeekBar sb_environmentalReverb;
    @Bind(R.id.list)
    ListView list;
    @Bind(R.id.headLayout)
    LinearLayout headLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        loadingMedias();
        startService(new Intent(this, MusicService.class));
        list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, strings));
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (musicService != null) {
                    musicService.load(mediaInfos.get(position));
                }
            }
        });

        listener = new SeekBarListener();
        sb_bassBoost.setOnSeekBarChangeListener(listener);
        sb_virtualizer.setOnSeekBarChangeListener(listener);
        equalizerBand0.setOnSeekBarChangeListener(listener);
        equalizerBand1.setOnSeekBarChangeListener(listener);
        equalizerBand2.setOnSeekBarChangeListener(listener);
        equalizerBand3.setOnSeekBarChangeListener(listener);
        equalizerBand4.setOnSeekBarChangeListener(listener);
        sb_environmentalReverb.setOnSeekBarChangeListener(listener);
    }

    @Override
    public void update() {
    }

    @Override
    public void updateProgress() {

    }

    class SeekBarListener implements SeekBar.OnSeekBarChangeListener {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            switch (seekBar.getId()) {
                case R.id.bassBoost:
                    if (bassBoost.getStrengthSupported()) {
                        Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
                        short value = (short) seekBar.getProgress();
                        bassBoost.setStrength(value);
                        setPreference("bassBoost", value);
                    }
                    break;
                case R.id.virtualizer:
                    if (virtualizer.getStrengthSupported()) {
                        Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
                        short value = (short) seekBar.getProgress();
                        virtualizer.setStrength(value);
                        setPreference("virtualizer", value);
                    }
                    break;
                case R.id.equalizer_band0:
                    Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
                    Log.d(TAG, "equalizer.getNumberOfBands():" + equalizer.getNumberOfBands());
                    if (equalizer != null) {
                        short value = (short) (seekBar.getProgress() - 1500);
                        equalizer.setBandLevel((short) 0, value);
                        setPreference("equalizerBand0", value);
                    }
                    break;
                case R.id.equalizer_band1:
                    if (equalizer != null) {
                        short value = (short) (seekBar.getProgress() - 1500);
                        equalizer.setBandLevel((short) 1, value);
                        setPreference("equalizerBand1", value);
                    }
                    break;
                case R.id.equalizer_band2:
                    if (equalizer != null) {
                        short value = (short) (seekBar.getProgress() - 1500);
                        equalizer.setBandLevel((short) 2, value);
                        setPreference("equalizerBand2", value);
                    }
                    break;
                case R.id.equalizer_band3:
                    if (equalizer != null) {
                        short value = (short) (seekBar.getProgress() - 1500);
                        equalizer.setBandLevel((short) 3, value);
                        setPreference("equalizerBand3", value);
                    }
                    break;
                case R.id.equalizer_band4:
                    if (equalizer != null) {
                        short value = (short) (seekBar.getProgress() - 1500);
                        equalizer.setBandLevel((short) 4, value);
                        setPreference("equalizerBand4", value);
                    }
                    break;
                case R.id.environmentalReverb:
                    Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
                    short value = (short) (seekBar.getProgress() - 9000);
                    environmentalReverb.setReverbLevel(value);
                    setPreference("environmentalReverb", value);
                    break;
            }
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }
    }

    private int getPreference(String key) {
        return PreferenceManager.getDefaultSharedPreferences(this).getInt(key, 0);
    }

    private void setPreference(String key, int value) {
        SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
        editor.putInt(key, value).apply();
    }

    // MediaPlayer

    private void loadingMedias() {
        mediaInfos = exeAudioCursor(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                null, MediaStore.Audio.Media.IS_MUSIC + " = 1", null, null);
        strings = new ArrayList<>();
        for (MediaInfo info : mediaInfos) {
            strings.add(info.getTitle());
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, MusicService.class);
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unbindService(serviceConnection);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        musicService.clearCallback();
        stopService(new Intent(this, MusicService.class));
        bassBoost.release();
        virtualizer.release();
        equalizer.release();
        environmentalReverb.release();
    }

    private List<MediaInfo> exeAudioCursor(Uri uri,
                                           String projection[],
                                           String selection,
                                           String selectionArgs[],
                                           String sortOrder) {
        List<MediaInfo> infos = new ArrayList<>();
        Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
        if (cursor != null && cursor.getCount() > 0) {
            try {
                while (cursor.moveToNext()) {
                    String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                    String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                    String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
                    String res = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

                    MediaInfo item = new MediaInfo();
                    item.setArtist(artist);
                    item.setAlbum(album);
                    item.setTitle(title);
                    item.setPath(res);
                    infos.add(item);
                }
            } finally {
                cursor.close();
            }
        }
        return infos;
    }
}

源码下载

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MediaPlayerAndroid中用于播放音频和视频的类。它提供了一系列方法和回调函数,可以控制媒体的播放、暂停、停止以及获取和更新播放进度等操作。 在使用MediaPlayer之前,需要先创建一个MediaPlayer对象,并设置数据源。有两种方式可以创建MediaPlayer对象,一种是直接使用new关键字创建一个实例,然后调用setDataSource()方法设置数据源;另一种是使用MediaPlayerUtil类进行封装,通过init()方法进行初始化,并设置回调函数监听媒体状态的变化。 使用MediaPlayer时,可以通过调用start()方法开始播放音频,通过onPrepared()回调函数监听音频加载完成的事件,在此方法中可以取消加载进度条并开始播放。通过onSeekUpdate()回调函数可以更新播放进度条的状态。onCompletion()回调函数可以监听音频播放完成的事件。如果发生错误,可以调用reset()方法重置UI状态,并返回true表示处理错误。 关于MediaPlayer的更多详细信息,可以参考MediaPlayer的官方文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Android 使用MediaPlayer播放音频详解](https://blog.csdn.net/baidu_38627723/article/details/120429916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值