欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android MediaPlayer 音频倍速播放,调整播放速度

程序员文章站 2023-04-04 19:07:44
本文链接: "Android MediaPlayer 倍速播放,调整播放速度" 现在市面上的很多音视频App都有倍速播放的功能,例如把播放速度调整为0.5、1.5、2倍等等。 从Android API 23 (Android M)开始,MediaPlayer支持调整播放速度。 使用的方法是setPl ......

本文链接: android mediaplayer 倍速播放,调整播放速度

现在市面上的很多音视频app都有倍速播放的功能,例如把播放速度调整为0.5、1.5、2倍等等。

从android api 23 (android m)开始,mediaplayer支持调整播放速度。
使用的方法是setplaybackparams,传入一个代表播放属性的类playbackparams。

本文介绍如何使用mediaplayer调整播放速度。

mediaplayer.setplaybackparams 说明

播放速度设置在playbackparams对象中,再将此对象传入setplaybackparams。

setplaybackparams是一个native方法。
如果mediaplayer没有准备(在prepared之前),调用此方法并不会改变mediaplayer的状态。
在mediaplayer成功prepare之后,如果设置的速度为0,相当于调用了pause方法;如果设置速度不为0,相当于调用了start方法。

异常情况

如果mediaplayer没有初始化或者已经被释放,即处于idle或end状态,调用setplaybackparams方法会抛出illegalstateexception异常。

如果传入的playbackparams不被支持,则抛出illegalargumentexception异常。

如果设置速度小于0,则抛出java.lang.illegalargumentexception异常。

mediaplayer.setplaybackparams 方法示例

设置播放速度。先判断当前系统版本。

private boolean setplayspeed(float speed) {
    if (build.version.sdk_int >= build.version_codes.m) {
        playbackparams params = mediaplayer.getplaybackparams();
        params.setspeed(speed);
        mediaplayer.setplaybackparams(params);
        return true;
    }
    return false;
}

getplaybackparams可以获取到mediaplayer当前的playbackparams对象。
也可以给这个方法加上try catch,结合返回的boolean值判断设置速度是否成功。

private boolean setplayspeed(float speed) {
    if (build.version.sdk_int >= build.version_codes.m) {
        try {
            playbackparams params = mediaplayer.getplaybackparams();
            params.setspeed(speed);
            mediaplayer.setplaybackparams(params);
            return true;
        } catch (exception e) {
            log.e(tag, "setplayspeed: ", e);
            return false;
        }
    }
    return false;
}

参考代码 https://github.com/rustfisher/android-mediaplayer

playbackparams 包含的速度值

调整mediaplayer播放速度时,我们使用了playbackparams对象。audiotrack也会用到这个类。

playbackparams包含着播放时候的一些属性。例如speed就是播放速度。

playbackparams.setspeed(float speed)

传入速度倍率值。会标记当前设置过了速度。

public playbackparams setspeed(float speed) {
    mspeed = speed;
    mset |= set_speed;
    return this;
}

playbackparams.getspeed()

获取已设置的速度值。如果之前没设置过速度,则抛出illegalstateexception异常。

public float getspeed() {
    if ((mset & set_speed) == 0) {
        throw new illegalstateexception("speed not set");
    }
    return mspeed;
}