Ionic2 播放mp3功能实现
在开发app的过程中有需要播放mp3的功能,一直想实现,但苦于具体的困难一直未能实现,经过一段时间的资料查询和测试,最终摸索出来,现记录如下:
1.最重要的是安装第三方插件ionic-audio,开源地址是 https://github.com/arielfaur/ionic-audio
第一,cd D:\Dev\sourcecode\IonicApp\FlexApp\IonicEnglish 目录下

第二,安装插件到本地: npm install ionic-audio --save, 安装完成后的效果图如下

2.在src/app/app.module.ts文件中加入 IonicAudioModule.forRoot(),如图

3.在我们自己的页面中引入AudioProvider类
 import { Component } from '@angular/core';
 import { NavController, NavParams,LoadingController } from 'ionic-angular';
 import { URLSearchParams } from '@angular/http';
 import { CommonService } from '../../providers/baseService/CommonService';
 import { AudioProvider } from 'ionic-audio';
 /*
   Generated class for the English page.
   See http://ionicframework.com/docs/v2/components/#navigation for more info on
   Ionic pages and navigation.
 */
 @Component(
 {
   selector: 'page-english',
   templateUrl: 'english.html'
 })
 export class EnglishPage
 {
   private groupEnglish ;
   private shownGroup ;
   public englishWord:string;
   public loading;
   public startIndex: number;
   constructor(public navCtrl: NavController, public navParams: NavParams,private loadCtrl:LoadingController,private audioProvider: AudioProvider,private service:CommonService)
   {
       this.groupEnglish = [];
       this.shownGroup = {};
       this.startIndex = 0;
   }
   ionViewDidLoad()
   {
       console.log('ionViewDidLoad EnglishPage');
   }
   search()
   {
       let url = 'XXXXX';
       let val = this.englishWord;
       let searchParams = new URLSearchParams()
       searchParams.set('key', val);
       this.loading = this.loadCtrl.create({ content: '加载中...'});
       this.loading.present();
       this.service.getJsonDataParameter(url,searchParams).then(result =>
       {
                     //this.groupEnglish = result.Data;
                     this.groupEnglish = [];
                     for(var i = 0; i< result.Data.length; i++)
                     {
                        let ele = {
                                       src: 'url'+result.Data[i].Word+'.mp3',
                                       item : result.Data[i]
                                  };
                        this.groupEnglish.push(ele);
                     }
                     this.loading.dismiss();
       },
       err =>
       {
       });
   }
   onTrackFinished(track: any)
   {
       if(this.audioProvider.tracks.length > this.startIndex )
       {
          this.startIndex = this.startIndex + 1;
          this.autoPlay();
       }
       else
       {
          this.startIndex = 0;
          this.audioProvider.stop();
       }
   }
   autoPlay()
   {
      this.audioProvider.play(this.startIndex);
   }
   toggleGroup(group,id)
   {
                 if (this.isGroupShown(group))
                 {
                     this.shownGroup = null;
                 }
                 else
                 {
                     this.shownGroup = group;
                     this.startIndex = id;
                     this.autoPlay();
                 }
   }
   isGroupShown(group)
   {
          return this.shownGroup === group;
   }
 }
播放mp3的数据格式是A:
{
      src: 'mp3数据源,本地的或网络的都可以,必须的字段',
      artist: '作者名称',
      title: '标题',
      art: '图片',
      preload: 'metadata' // tell the plugin to preload metadata such as duration for this track, set to 'none' to turn off
},
我这里就根据自己的需要就只用了src数据源字段,同时添加了自己的一个类字段item .
将获得的数据groupEnglish数组绑定到对应的网页上,
<ion-content> <ion-list>
<audio-track #audio *ngFor="let item of groupEnglish" [track]="item" (onFinish)="onTrackFinished($event)">
<ion-item>
<ion-item class="rectangle" (click)="toggleGroup(item.item,audio.id)">
<i class="ion-icon" >
{{item.item.Word}}
</i>
<i style="color:green;font-size:14px"> {{item.item.Accent}}</i>
<i style="font-size:10px">词频</i>
<i style="color:red;font-size:10px"> {{item.item.Index}}</i>
<i style="font-size:10px">{{item.item.Source}}</i>
</ion-item >
<div *ngIf="isGroupShown(item.item)">
<ion-item text-wrap class="rectangle" *ngFor="let it of item.item.Items" >
<div [innerHTML]="it.Sentence">
</div>
</ion-item>
</div>
</ion-item>
</audio-track>
</ion-list>
</ion-content>
其中的audio-track节点是必须的,数据绑定之后的#audio 是一个类,包含了前面的数据源数据A和我们自己的数据item
这里尤其强调的是audio其中的id字段,播放mp3的时候是根据这个id来确定的,这个id基本上是按顺序从0开始的。
基本都这里就实现了mp3的播放。
4.实现自动的播放mp3功能。
基本思路是每一个mp3播放完毕之后都会调用onTrackFinished事件,在这里,调用下一个mp3的开始。
这里一个有意思的事情是,每次查询之后将groupEnglish清零,下标也清零,重新开始从头播放。如果是第一次查询出来的结果,这样一个个的播放是没问题的,但第二次查询出来之后播放的还是第一次的数据,经排查原因是this.audioProvider.tracks还是保留了上一次的数据,所以要么清除上次的数据,要么在原来的基础上id继续增加,我选择的是后者。
Ionic2 播放mp3功能实现的更多相关文章
- java实现播放mp3功能
		1.首先引入jlayer.jar <!-- https://mvnrepository.com/artifact/javazoom/jlayer --> <dependency> ... 
- 在C语言控制台程序中播放MP3音乐
		游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ... 
- 微信小程序背景音频播放分享功能
		如果正常背景音频播放的话,只能跳转到自己对应的微信小程序,无法分享朋友圈,我们需要设置分享朋友圈,需要调用一个API 音频背景播放 注意:背景播放在锁屏后播放只支持IOS端,安卓端虽然可以播放,但是锁 ... 
- Swift实现iOS录音与播放音频功能
		作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 #import <AVFoundation/AVFound ... 
- 读取SD卡文件夹下的MP3文件和播放MP3文件
		首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ... 
- 遭遇flash播放mp3诡异问题
		在部分ie10+flash player 播放mp3,播放第二句话时,中断无法正常播放,(客户的机器上),自己公司的机器测试了几个,都没发现这个问题.其它浏览器(chrome,firefox)也没发现 ... 
- Android命令行播放MP3音乐
		/*************************************************************************** * Android命令行播放MP3音乐 * 说 ... 
- ios开发——实用技术篇Swift篇&播放MP3
		播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ... 
- ubuntu 13.10 Rhythmbox不能播放mp3 和中文乱码的问题
		1.ubuntu 13.10 Rhythmbox不能播放mp3的解决方法 软件中心搜索(ubuntu额外的版权受限软件)不带括号 2.中文乱码问题解决方法: 终端顺序操作 : 1. sudo ged ... 
随机推荐
- 我的Java之旅 第五课 JAVA 语言语法 集合
			JAVA集合只能存放引用类型的的数据,不能存放基本数据类型,int 可以用 Integer代替. 一.集合接口 1. Iterable<E> 实现这个接口允许对象成为 "fo ... 
- 贝塞尔曲线UIBezierPath简单使用
			//常用属性 /* 1.CGPath: 将UIBezierPath类转换成CGPath 2.currentPoint: 当前path的位置,可以理解为path的终点 3.lineWidth: 线条宽度 ... 
- python 遇到的小坑
			由于前端资源紧缺,我的后端系统迟迟等不来它的前端,没办法只好自己来写了.从html,js入门学起,然后照着vue.js的官方教程写了几个实例,从github上clone了一个不错的vue.js模版,填 ... 
- Tensorflow实现稀疏自动编码(SAE)
			1.概述 人在获取图像时,并不是像计算机逐个像素去读,一般是扫一眼物体,大致能得到需要的信息,如形状,颜色,特征.怎么让机器也有这项能力呢,稀疏编码来了. 定义: 稀疏自编码器(Sparse Auto ... 
- forfiles命令详解
			目录复制命令: xcopy //server/bak/*.* d:/serverbak /s /e /v /c / d /y /h at 05:30 shutdown ... 
- HDU ACM 2066 一个人的旅行
			一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ... 
- ASP.NET WebForm 检测页面刷新(Refresh)
			本文是翻译贴, 原文参见Detecting browser 'Refresh' from Code behind in C# 浏览器的"刷新"常会导致问题, 特别是当页面和数据库有 ... 
- Xmind破解
			原始教程 http://df1551e3.wiz03.com/share/s/3v5l7z2wdQVs2llAUc0C_-n_2cPZVe0kEA2n2iw1Ay1ApF_o 
- File类_常见的方法(获取系统根目录与指定目录的容量)
			获取系统根目录 import java.io.File; public class File_ListRoots { public static void main(String[] args) { ... 
- css权重 vs 浏览器渲染 -- css之弊病
			昨日,突现一个bug,令人十分恼火. 基本场景 自己实现一多选日历,可多选多天(相连或不相连均可)."贵司"的需求真心有些小复杂了,"市面"上没有这样的相似的东 ... 
