Android MediaPlayer 在API 23即6.0版本开始支持倍速播放,下面我们来介绍一下如何使用MediaPlayer进行倍速播放。

一、核心接口

MediaPlayer.setPlaybackParams(PlaybackParams params) throws IllegalStateException, IllegalArgumentException

1. 接口说明

(1) 使用这个接口可以进行播放速率的设置。
(2) 播放器prepared状态之前调用这个方法不会更改播放器的状态。
(3) prepared状态之后设置速率0等同于调用pause(),当调用start恢复播放以后,将以原来的速率进行播放。
(4) prepared状态之后设置非0的速率等同于调用start()。
(5) 当播放器还未初始化或者已经被释放的时候设置会抛IllegalStateException的异常。
(6) 当参数不支持的时候会抛IllegalArgumentException的异常。

2. 设置时机要求

合法的时机:Initialized, Prepared, Started, Paused, PlaybackCompleted, Error
非法的时机:Idle, Stopped

二、使用示例

本例为悬浮弹窗播放View,在此基础上增加了倍速播放的测试逻辑,经测试,发现此API可用,且效果基本和ijk播放器一样。

public class FloatingPopupWindow implements SurfaceHolder.Callback {

    // 弹窗宽度
private static final int POPUP_WINDOW_WIDTH = 567; // 弹窗高度
private static final int POPUP_WINDOW_HEIGHT = 432; private Context mContext; private PopupWindow mPopupWindow; private View mPopContentView; private RelativeLayout mFloatingLayout; SurfaceView surfaceView; SurfaceHolder surfaceHolder; MediaPlayer mediaPlayer; private boolean IsDouble = false;
private float lastX;
private float lastY; public FloatingPopupWindow(Context context) {
mContext = context;
mPopContentView = LayoutInflater.from(mContext).inflate(R.layout.popup_window_floating, null);
mPopupWindow = new PopupWindow(mPopContentView, POPUP_WINDOW_WIDTH, POPUP_WINDOW_HEIGHT);
mFloatingLayout = mPopContentView.findViewById(R.id.floating_layout);
surfaceView = mPopContentView.findViewById(R.id.surface_view);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
mPopContentView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (event.getPointerCount() == 1) {
IsDouble = false;
}
if (!IsDouble) {
lastX = event.getRawX();
lastY = event.getRawY();
}
break;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() > 1) {
IsDouble = true;
}
if (!IsDouble) {
int deltaX = (int) (event.getRawX() - lastX);
lastX = event.getRawX();
int deltaY = (int) (event.getRawY() - lastY);
lastY = event.getRawY();
mPopupWindow.update(deltaX + (int) lastX - (POPUP_WINDOW_WIDTH / 2), deltaY + (int) lastY - (POPUP_WINDOW_HEIGHT / 2), -1, -1, true);
}
break;
}
return true;
}
});
mediaPlayer = new MediaPlayer();
} /**
* 是否显示
*/
public boolean isShowing() {
return mPopupWindow.isShowing();
} public void setPlayPath(String playPath) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(playPath);
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void surfaceCreated(SurfaceHolder holder) {
Surface surface = holder.getSurface();
mediaPlayer.setSurface(surface);
mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
// 6.0及以后支持倍速,测试
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mp.setPlaybackParams(new PlaybackParams().setSpeed(0.75f));
}
}
}); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
dismiss();
}
});
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override
public void surfaceDestroyed(SurfaceHolder holder) { } private View mNowView; // 当前容器里面装载的View /**
* 添加新View
*/
public void addView(View view) {
mNowView = view;
if (mFloatingLayout != null) {
mFloatingLayout.addView(view);
}
} /**
* 获取当前正展示的View
*/
public View getNowView() {
return mNowView;
} /**
* 移除所有的子布局
*/
public void removeAllView() {
if (mFloatingLayout != null) {
mFloatingLayout.removeAllViews();
}
} /**
* 显示弹出框
*/
public void show(View view) {
if (isShowing()) {
return;
}
mPopupWindow.showAtLocation(view, Gravity.NO_GRAVITY, 0, 200);
} /**
* 隐藏弹出框
*/
public void dismiss() {
if (mPopupWindow != null) {
if (mPopupWindow.isShowing()) {
mPopupWindow.dismiss();
}
}
}
}

Android MediaPlayer 在 6.0 以上版本使用倍速播放功能说明的更多相关文章

  1. [Android自动化] 在 pip-9.0.1 版本情况下安装 uiautomator2 报错的解决办法

    1.在命令窗口中使用命令: pip install uiautomator2 时报 pip 版本过低,需要先升级 pip 版本,理论上会按照提示进行升级 pip 操作,但执行升级命令时到最后却还是报错 ...

  2. AppCompat v21 — Android 5.0之前版本设备的Material Design实现

    博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打 ...

  3. Android studio 3.0以上版本无法引入,找不到v4,v7包方案解决

    Android studio 3.0以上版本无法引入v4.v7包报红,即找不到v4.v7包,解决方案如下: 步骤: 1,Close Object,点击左上角的关闭工程. 2,点击x,删除项目. 3,重 ...

  4. Android Studio 3.0.1 版本包下载

    Android Studio 3.0.1 发布了,这是对 Android Studio 3.0 的一个小的更新,包括一般错误修复和性能改进 下载地址: Windows 64 位:https://dl. ...

  5. 如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例

    前提 Cordova Android 7.0.0开始改变了项目安卓平台的架构.新建一个空项目分别添加Android 6.4.0 和 Android 7.0.0平台: cordova platform ...

  6. 对Android 8.0以上版本通知点击无效的一次分析

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/178 对Android 8.0以上版本通知点击无效的一次分 ...

  7. Android P(9.0) userdebug版本执行adb remount失败

    [DESCRIPTION]      在android P版本上如果按照“FAQ18076 android 6.0 M userdebug版本执行adb remount失败”的做法在userdebug ...

  8. 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题

    快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题 转 https://www.jb51.net/article/144939.htm 今天小编就为大家分享一篇快速解决设置And ...

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

    本文链接: Android MediaPlayer 倍速播放,调整播放速度 现在市面上的很多音视频App都有倍速播放的功能,例如把播放速度调整为0.5.1.5.2倍等等. 从Android API 2 ...

随机推荐

  1. 使用SQL生成指定数据库的数据字典(MSSQL)

    USE DBNAME --指定要生成数据字典的数据库 GO SELECT 表名= CASE WHEN a.colorder= 1 THEN d.name ELSE '' END, 表说明= CASE ...

  2. 利用keras自带路透社数据集进行多分类训练

    import numpy as np from keras.datasets import reuters from keras import layers from keras import mod ...

  3. docker-compose 部署 Vue+SpringBoot 前后端分离项目

    一.前言 本文将通过docker-compose来部署前端Vue项目到Nginx中,和运行后端SpringBoot项目 服务器基本环境: CentOS7.3 Dokcer MySQL 二.docker ...

  4. C#通用查询器

    很多通用查询器,对查询条件中的AND及OR的支持度不是很好,要么全部是AND要么全部是OR.笔者通过一段时间的摸索,终于完成了一个自己较为满意的通用查询器, 可以实现多条件的AND及OR,现将实现过程 ...

  5. C# base

    using System; using System.Collections.Generic; using System.Text; namespace 继承 { class Program { st ...

  6. markdown简单使用

    Markdown介绍: ​ Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档.使用Markdown编写的文档可以导出为HTML.Word.图像.PDF等多种格式的文档. ...

  7. 程序结构设计理论(Android)

    程序结构设计理论(Android) 作者:邓能财 2019年9月24日 个人简介 姓名:邓能财 年龄:26 毕业学校:东华理工大学 院系:理学院 专业:信息与计算科学 邮箱:2420987186@qq ...

  8. HTML连载55-网易注册界面实战之input填充

    一.又学一招:想要让两个盒子高度对齐,那么让他们浮动起来 <!DOCTYPE html> <html lang="en"> <head> < ...

  9. Goland快捷键(Macbook)

    Goland快捷键(Macbook) 基础编辑快键键 向上或向下移动当前行 ⇧⌘↑ ⇧⌘↓ 复制并粘贴当前选中的语句 ⌘D 删除当前行 ⌘⌫ 行注释 ⌘/ 块注释 ⌥⌘/ 在当前打开的文件中寻找 ⌘F ...

  10. 团队项目之Scrum6

    小组:BLACK PANDA 时间:2019.11.26 每天举行站立式会议 提供当天站立式会议照片一张 2 昨天已完成的工作 2 编辑功能优化 实现主页内容展示 今天计划完成的工作 2 内容展示 根 ...