【Android】20.1 音频播放
分类:C#、Android、VS2015;
创建日期:2016-03-11
一、简介
MediaPlayer:适合每次播放一个音频资源或者音频文件的场合。
SoundPool:适合同时播放多个音频资源或者音频文件的场合。
二、用MediaPlayer播放
在安卓系统中,播放音频最简单的方法是使用内置的媒体播放器(MediaPlayer类)。MediaPlayer既可以播放本地文件,也可以播放来自URL的网络数据流。
1、创建MediaPlayer实例
有两种创建MediaPlayer实例的办法,
办法1:
MediaPlayer player = MediaPlayer.Create(this, Resource.Raw.test);
用MediaPlayer.Create创建实例时可直接指定数据源。
办法2:
MediaPlayer player = new MediaPlayer();
2、数据源
有3种。
(1)播放raw文件夹下的资源文件
应用程序自带的音乐资源一般保存到raw文件夹下,下面的代码演示了如何播放Resource/raw下的媒体文件:
MediaPlayer mPlayer=MediaPlayer.Create(this, Resource.Raw.MyAudio);
mPlayer.Start();
注意:这种方式主要适用于播放应用程序自带的容量较小的资源文件,例如接听电话时播放的音乐、按键音、开机启动音、信息提示音等都可以随应用程序一块发布。
(2)播放来自文件系统的媒体文件
指播放Android默认的系统标准文件夹下、Assets文件夹下、SD卡中的媒体文件,这些文件都属于文件系统。
以下描述了使用MediaPlayer从文件系统中播放音频的步骤:
- 初始化MediaPlayer对象。
- 通过SetDataSource方法(同步方式)或者SetDataSourceAsync方法(异步方式)设置要播放的文件。
- 调用Prepare方法(同步方式)或者PrepareAsync方法(异步方式)初始化播放器。
- 调用Start方法开始音频播放。
- 注意采用这种方式时,播放顺序非常重要:先设置数据源、同步播放设备,最后再调用Start方法播放。
播放来自文件系统的媒体文件时,可通过MediaPlayer的SetDataSource()方法指定数据源,该方法的重载形式很多,常用有:
SetDataSource (string path)
SetDataSource (FileDescriptor fd)
SetDataSource (Context context, Uri uri)
SetDataSource (FileDescriptor fd, long offset, long length)
(3)播放来自网络的媒体流
对于用URL指定的媒体流,有两种播放形式。
方式1:与播放本地资源文件的处理办法相似。
方式2:与播放本地文件系统的处理办法相似。
3、播放控制
MediaPlayer只能从标准移动设备(扬声器、蓝牙耳机)中播放音频,不能从通话用的话筒中播放音频。
调用Pause方法可暂停播放:player.Pause();
调用Start方法恢复播放:player.Start();
调用Stop方法停止播放:player.Stop();
当不再需要播放器时,必须调用player.Release();将其从内存中释放。
三、用SoundPool播放
SoundPool适合同时播放多个音频资源或者音频文件的场合。比如游戏中同时出现的多个声音和背景音乐。
四、例20-1--AudioPlayDemo
下面通过例子说明播放音频文件最基本的用法。
1、运行截图

2、设计步骤
说明:SD卡Download文件夹下的音乐文件(ch2001dj2.mp3)是通过执行代码拷进去的(没有就复制,有了就不复制了)。其他铃声和音乐文件需要自己手工拖放到项目中对应的文件夹下。
(1)在raw和Assets下分别添加一些音频文件
由于是学习基本用法,所以文件自己随便找吧。
本示例放到raw文件夹下的文件有:
铃声:ch2001ringin1.wav
开枪:ch2001ZR35.wav
音乐:ch2001dj1.mp3
本示例放到Assets文件夹下文的件有:
音乐:ch2001dj2.mp3
(2)添加ch2001Main.axml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/ch2001_btnRawRing"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放RAW下的铃声资源" />
<Button
android:id="@+id/ch2001_btnRawMusic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放RAW下的音乐资源" />
<Button
android:id="@+id/ch2001_btnAssetsMusic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放附件下的音乐文件" />
<Button
android:id="@+id/ch2001_btnDownloadMusic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="播放SD卡中的音乐文件" />
<Button
android:id="@+id/ch2001_btnSoundPool"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="同时播放多个音乐" />
<Button
android:id="@+id/ch2001_btnStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止播放"
android:layout_marginTop="30dp" />
</LinearLayout>
(3)添加ch2001MainActivity.cs文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Media;
using System.Threading.Tasks;
using System.IO; namespace MyDemos.SrcDemos
{
[Activity(Label = "例20-1 音频播放基本用法")]
public class ch2001MainActivity : Activity
{
private MediaPlayer player = null;
private SoundPool soundPool;
private SortedList<int, int> sounds;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.ch2001Main);
soundPool = new SoundPool(maxStreams: , streamType: Android.Media.Stream.Music, srcQuality: );
sounds = new SortedList<int, int>();
//0:不循环,-1:循环
sounds.Add(soundPool.Load(this, Resource.Raw.ch2001ringin1, ), -);
sounds.Add(soundPool.Load(this, Resource.Raw.ch2001ZR35, ), -); var btnRawRing = FindViewById<Button>(Resource.Id.ch2001_btnRawRing);
btnRawRing.Click += delegate
{
StopPlayer();
try
{
player = MediaPlayer.Create(this, Resource.Raw.ch2001ringin1);
player.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}; var btnRawMusic = FindViewById<Button>(Resource.Id.ch2001_btnRawMusic);
btnRawMusic.Click += delegate
{
StopPlayer();
try
{
player = MediaPlayer.Create(this, Resource.Raw.ch2001dj1);
player.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}; var btnAssetsMusic = FindViewById<Button>(Resource.Id.ch2001_btnAssetsMusic);
btnAssetsMusic.Click += delegate
{
StopPlayer();
try
{
var fd = Assets.OpenFd("ch2001dj2.mp3");
player = new MediaPlayer();
player.Reset();
player.SetDataSource(fd.FileDescriptor);
player.Prepare();
player.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}; var btnDownloadMusic = FindViewById<Button>(Resource.Id.ch2001_btnDownloadMusic);
btnDownloadMusic.Click += delegate
{
StopPlayer();
try
{
string path = GetDownloadFile("ch2001dj2.mp3");
player = new MediaPlayer();
player.Reset();
player.SetDataSource(path);
player.Prepare();
player.Start();
}
catch (Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}; var btnSoundPool = FindViewById<Button>(Resource.Id.ch2001_btnSoundPool);
btnSoundPool.Click += delegate
{
StopPlayer();
AudioManager mgr = (AudioManager)GetSystemService(Context.AudioService);
float currentStreamVolume = mgr.GetStreamVolume(Android.Media.Stream.Music);
float maxStreamVolume = mgr.GetStreamMaxVolume(Android.Media.Stream.Music);
float volume = currentStreamVolume / maxStreamVolume;
foreach (var v in sounds)
{
soundPool.Play(v.Key, volume, volume, , v.Value, 1.0f);
}
}; var btnStop = FindViewById<Button>(Resource.Id.ch2001_btnStop);
btnStop.Click += delegate
{
StopPlayer();
};
} protected override void OnDestroy()
{
base.OnDestroy();
StopPlayer();
soundPool.Release();
} /// <summary>
/// 同时播放多个音频
/// </summary>
/// <param name="soundID">音频资源的id</param>
/// <param name="loop">0:不循环,-1:循环</param>
private void PlaySound(int soundID, int loop)
{
AudioManager mgr = (AudioManager)GetSystemService(Context.AudioService);
float currentStreamVolume = mgr.GetStreamVolume(Android.Media.Stream.Music);
float maxStreamVolume = mgr.GetStreamMaxVolume(Android.Media.Stream.Music);
float volume = currentStreamVolume / maxStreamVolume;
soundPool.Play(soundID, volume, volume, , loop, 1.0f);
} private void StopPlayer()
{
if (player != null)
{
if (player.IsPlaying)
{
player.Stop();
}
player.Release();
player = null;
}
if (soundPool != null)
{
foreach (var v in sounds)
{
soundPool.Stop(v.Key);
}
}
} /// <summary>
/// 该方法仅为了演示如何将Assets下的文件复制到SD卡上
/// 如果SD卡的Download文件夹下不存在指定的文件,就将其复制到该文件夹下。
/// 如果存在,直接返回路径
/// </summary>
/// <param name="fileName">Assets文件夹下的文件名</param>
/// <returns>SD卡的Download文件夹下的文件路径</returns>
private string GetDownloadFile(string fileName)
{
//注意此操作需要 android.permission.WRITE_EXTERNAL_STORAGE 权限
//由于第3章已经添加过此权限,所以该例子不需要再添加了 //SD卡Download文件夹下的文件路径
string filePath = string.Format("{0}/{1}/{2}",
Android.OS.Environment.ExternalStorageDirectory.Path,
Android.OS.Environment.DirectoryDownloads,
fileName);
if (File.Exists(filePath) == false)
{
//如果不存在,就将Assets文件夹下的指定文件复制到SD卡的该文件夹下
var fromStream = Assets.Open(fileName);
int size = * ;
using (FileStream toStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
{
int n = -;
byte[] buffer = new byte[size];
while ((n = fromStream.Read(buffer, , size)) > )
{
toStream.Write(buffer, , n);
}
}
}
return filePath;
}
}
}
【Android】20.1 音频播放的更多相关文章
- Android多媒体技术之音频播放
1.Android中音频播放的方式和区别. MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放. SoundPool:主要用于播放一些短促的声音片段,主要优势是cpu资 ...
- Android中的音频播放(MediaPlayer和SoundPool)
Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...
- 【Android】20.0 第20章 音频、视频、拍照、语音合成
分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 Android提供了常见的多媒体文件编码.解码机制,你可以直接调用Android提供的API,实现相册.播放器.录 ...
- Android音频播放之SoundPool
SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...
- Android 学习笔记多媒体技术之 AsyncTask+实现音频播放...
PS:今天搞了一下如何实现音频播放...结果被坑了,看书上写的代码是挺简单的,但是有个函数就是死活没看懂,这真是受不了...最后才弄明白,原来是一个实现异步任务的一个类...这个类使用java.uti ...
- iOS Dev (20) 用 AVAudioPlayer 播放一个本地音频文件
iOS Dev (20) 用 AVAudioPlayer 播放一个本地音频文件 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 步骤 第一步:在 Proj ...
- android 音频播放总结 soundlPool,MediaPlay
soundlPool 用于小音频的播放多个同时播放. 使用步骤: 步骤一: 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下,区别在于assets下可以再新建文件夹二raw ...
- Android 音频播放速率调整实现
最近接触到的一个项目, 有音频播放.切换播放速率和拖动进度到某处播放的需求 ,由于之前只是见过并没有尝试过切换播放速率 , 于是开始调研并最终实现,下面简单记录一下这次的调研过程. MediaPlay ...
- Android 实现简单音乐播放器(二)
在Android 实现简单音乐播放器(一)中,我介绍了MusicPlayer的页面设计. 现在,我简单总结一些功能实现过程中的要点和有趣的细节,结合MainActivity.java代码进行说明(写出 ...
随机推荐
- java编程思想 第四版 第六章 个人练习
欢迎加群:239063848 进群须知:本群仅用于技术分享与交流.问题公布与解答 禁止闲聊.非诚勿扰 练习1:(1)在某个包中创建一个类,在这个类所处的包的外部创建该类的一个实例. import mi ...
- NYOJ 113 字符串替换(C++STL解法)
字符串替换 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描写叙述 编写一个程序实现将字符串中的全部"you"替换成"we& ...
- 新浪微博SSO登陆机制(转载)
原文地址: http://www.cnblogs.com/AloneSword/p/3840548.html 最近在使用sina微博时,经常性交替使用 weibo.com 和 t.sina.cm.cn ...
- ZH奶酪:VirtualBox虚拟机与主机ping不通
6.进入虚拟机的Ubuntu(以下简称VBUbuntu),在VBUbuntu中用ifconfig查看ip地址,在Windows7中用ipconfig查看ip地址. 在VBUbuntu中ping Win ...
- fcntl的区域锁定
文件中的某个部分被锁定了,但其他的程序可以访问这个文件的其他部分,称为文件段锁定或文件区域锁定.经常使用文件区域锁定是fcntl函数. #include <sys/types.h> #in ...
- HTML一(简介)
什么是 HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言,而是一种标记语言 (ma ...
- 寻找SQL注入点
如果要对一个网站进行SQL注入攻击,首先就需要找到存在SQL注入漏洞的地方,也就是寻找所谓的注入点.可能的SQL注入点一般存在于登录页面.查找页面或添加页面等用户可以查找或修改数据的地方. 最常用的寻 ...
- windows登陆密码破解方法之一
网上的一些人让别人进入命令提示符安全模式,我比较奇怪如果没有密码怎么进去?能进去干嘛还要进去? 本笨方法的原理主要是利用登陆界面的一些程序入口,把它当成后门来使用,比如win7登陆界面上除了输密码的地 ...
- java装箱拆箱
基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象的时候,我们会这样: Class a = new Class(p ...
- 一段测试try...catch运行时间的代码
public class Test2 { private static int test() { int i=1; try { i=2; ...