Android多媒体编程——MediaPlayer播放音乐

详解TCP/IP五层模型 TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。 阅读详情

Android多媒体——使用MediaPlayer播放声音

API

在我们的项目中经常会遇到播放声音的功能,在Android中系统的framework已经提供了调用播放声音的API——MediaPlayer 
在Android Developers中已经给出了相关的文档:

One of the most important components of the media framework is the MediaPlayer class. An object of this class can fetch, decode, and play both audio and video with minimal setup. It supports several different media sources such as:

  • Local resources
  • Internal URIs, such as one you might obtain from a Content Resolver
  • External URLs (streaming)

android中的MediaPlayer可以播放多种路径的声音文件 包括 本地资源声音文件,网络声音文件,内部的系统声音

播放本地文件:

使用时首先需要创建Mediaplayer 

创建方式一:

  
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
创建方式二:
   
MediaPlayer player= new MediaPlayer();
//重置播放器
player.reset();
//设置资源文件
player.setDataSource("sdcard/zxmzf.mp3");
//准备就绪
player.prepare();
//播放
player.start();

这里采用create创建,文档中说明这样创建是不需要调用prepare等api方法了,create()方法中已经完成了这些
播放内部URI文件:
   
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
播放网络文件:
   
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
在这里官方的文档给出了播放网络文件的条件:

如果需要播放网络上的文件,必须保证该资源可以下载

线程安全问题:
官方api指出,在调用prepare()方法的时候,会进行抓取和解码等操作,所以属于耗时任务,这样有可能带来系统的ANR(应用程序未响应) 所以我们不应该执行耗时的任务在UI线程。给出了需要播放时可以使用媒体播放器框架,这个框架提供了一个方便的方法——使用prepareAsync()异步方法。这个方法被调用后媒体开始在后台准备播放所需要的解码等任务,并且会立即返回。当准备完毕后会回调MediaPlayer.OnPreparedListener方法,所以我们可以为媒体播放器设置监听来监听准备的状态 setOnpreparedListener()
管理播放器的状态:
MediaPlayer是有特定的状态的,如果错误的执行某状态下的操作,可能会抛出异常,应当是创建新的媒体播放器时,这个媒体播放器是处于闲置状态的,需要设置setDataSource()来进行初始化,初始化完成后使用prepare()/prepareAsync()方法来使MediaPlayer进入准备状态,当准备已经完成后,Media会进入就绪状态,这时可以调用start()方法来播放。可以使用pause()来暂停播放,也可以使用stop()停止播放。当你调用stop()方法时会停止播放。但是这时候停止后不能直接重新开始,你需要再次进行reset() 重新准备 才能重新播放
资源的释放:
媒体播放器资源是占用系统内存的,由于是底层硬件操作,不会主动地释放资源,所以我们需要收懂的释放资源,当不需要使用的时候,我们应该调用relase()方法释放资源,当使用MediaPlayer在一个系统的Service中时,我们需要释放播放器和服务
   
mediaPlayer.release();
mediaPlayer = null;
服务中使用Media
,就像一个Service,所有工作在一个Service是在一个线程中完成由违约事实,如果你正在运行一个activity从相同的应用程序和service,他们使用相同的线程(主线程)默认情况下。因此,服务需要迅速处理传入的意图,从不执行冗长的计算当回应他们。如果预计任何繁重的工作或阻塞调用,你必须做这些任务异步:从另一个线程实现你自己,或者使用框架的许多设施异步处理。
文档中给出了使用播放器在服务中的用法,强调就绪应当调用 prepareAsync()而不是prepare(),实现 MediaPlayer.OnPreparedListener接口
   
public class MyService extends Service implements MediaPlayer.OnPreparedListener {
private static final String ACTION_PLAY = "com.example.action.PLAY";
MediaPlayer mMediaPlayer = null;
 
public int onStartCommand(Intent intent, int flags, int startId) {
...
if (intent.getAction().equals(ACTION_PLAY)) {
mMediaPlayer = ... // initialize it here
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepareAsync(); // prepare async to not block main thread
}
}
 
/** Called when MediaPlayer is ready */
public void onPrepared(MediaPlayer player) {
player.start();
}
}
API中还介绍了使用唤醒锁保证媒体播放不受到系统睡眠的影响,作为前台服务运行。详情请查阅Develop文档
附上MediaPlayer的状态图

8-阿里云服务器 ECS配置R及Studio Server 步骤概览:(首先要明确自己的系统然后进行安装) 阅读详情

相关推荐

Python | 处理CMIP6 NC数据,以tas为例

各位同学,一般在文章最后一章我们可能会做不同气候情景下变量的未来时空变化特征,类似上图。从cmip6下载的nc数据常需要转换格式、裁剪到研究区和重采样等,本期代码可以解决这类问题。

qq_48539301的博客 1384

Android mediaPlayer属性详解

一、首先说一下mediaplayer的状态 空闲状态:当mediaplayer对象背创建或者调用reset()之后 准备状态:调用create()之后 结束状态:调用release() 二、mediaplayer使用流程 1、首先创建一个mediaplayer对象:private MediaPlayer mediaPlayer = new MediaPlayer(); 2、mediap

yx511024的博客 1282

学习笔记:物理信息神经网络(PINN)

PINN 的强大在于它打破了传统数值方法的限制,将神经网络的非线性拟合能力与物理方程的严谨性结合起来。它在处理高维、数据稀缺、复杂物理约束的场景下尤其出色。当然,PINN 也有收敛慢、梯度消失等挑战,比如,复杂 PDE 可能导致梯度传播困难,收敛慢(梯度消失)、于具有快速变化特征的系统,如冲击波,标准 PINN 可能精度不足,需要改进策略,比如自适应采样或多尺度特征提取。但随着研究深入,这些问题正在不断被解决。物理或化学方程为什么往往是偏微分方程?什么是物理信息神经网络(PINN)?x_%7Bi%7D。

qq_52635735的博客 1万+

MediaPlay播放不出声音

开发过程遇到: AssetFileDescriptor afd = c.getAssets().openFd("ring.mp3"); mMediaPlayer.setDataSource(afd.getFileDescriptor()); mMediaPlayer.setDataSource(c.getResources().openRawResourceFd(R

MaoDunTi的专栏 4626

CMOS传输门(互补开关)实战指南 | 设计优化 + 常见问题解析

本文深入解析CMOS传输门(互补开关)的设计优化与常见问题,涵盖导通特性、版图设计、高频应用及混合信号设计等关键领域。通过实测数据和优化技巧,帮助工程师解决衬底连接、信号完整性等实际问题,提升数字和模拟混合信号设计的效率与可靠性。

weixin_29229989的博客 161

告别调参玄学:用 DINOv2 (ViT-S/ViT-G) 和 PCA 可视化,直观理解自监督特征

本文深入解析了DINOv2(ViT-S/ViT-G)模型在自监督学习中的特征提取机制,通过PCA降维技术实现特征空间的可视化。文章对比了不同规模模型的特征表达差异,并提供了PCA阈值调优和深度分析的实用技巧,帮助读者直观理解自监督学习的视觉密码。

weixin_42565865的博客 409

配合工具解决MediaPlayer突然没有声音(mediaplayer报错what=1, extra=-19·)

        上回写了一篇博文,谈及MediaPlayer播放器有时候会没有声音的问题:(what=-38,extra=0) ,这篇文单讲的主要是在不恬当的状态下做了不适当的操作导致的,如当你release之后,当然不能做播放操作。当然这bn也是一个问题。后来,公司的测试人员,又找了我说,又复现了问题。然后他就复现给我看,他采取了频繁进出Activity的操作。这个当然能想到的是内存泄露等等问题...

慢行的狮子 5526

Qt6导航组件系列专栏:30+常见导航场景的实现

本文介绍了Qt6导航组件系列专栏,涵盖30+常见导航场景的实现方案。专栏分为7组:基础侧边栏系列、社交与协作导航系列、文件与项目导航系列、工业与车载导航系列、创意与扩展导航系列、办公与效率导航系列、流程与引导导航系列。

u011186532的专栏 1132

android 面试算法题 实现单链表反转(1),面试官问技术问题不太会怎么办

T行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!(5)反转后得到的链表最后一个结点是否为null?考虑完以上问题后,就能够写出正确的代码了。(2)假设链表为单节点链表,该怎样处理?(3)怎样防止在反转过程中断链?(4)反转后head是否更新?实现自定义链表反转类。

2401_84103675的博客 646

ADS基础教程22 - 有限元电磁仿真(FEM)

一、引言二、FEM操作过程1.新建Layout1.新建Layout2.EM设置3.设置Frequency plan4.设置Output plan5.设置Options6.设置网格频率7.仿真结果三、总结介绍了在ADS中如何进行FEM仿真过程。END!}}END!

XZ_ZC的博客 2580

高通开发系列 - Bootloader之lk匹配dtb和dtbo中msm-id和board-id的知识

lk匹配dtb和dtbo中的msm-id和board-id等知识

fulinux的博客 4245

Android 视频播放器 (二):使用MediaPlayer播放视频

在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容。也知道VideoView内部封装的就是MediaPlayer,本文就介绍如何使用MediaPlayer播放视频。 一、简介 MediaPlayer是Android中的一个多媒体播放类,其提供的API能满足简单的大部分音视频的播放需求。 下面简单...

weixin_34235457的博客 839

为什么我的 Spark Executor / Yarn Container 只有一个vCore?

在很多集群里,在关闭了Spark的DynamicAllocation的前提下(避免自动申请空闲资源,干扰测试结果),都会观察到:提交Spark作业时,申请 1 个 driver + n 个 executor 会在Yarn上会对应创建 n+1 个 container,但是每个container只有一个vCore,通过--driver-cores和--executor-cores设定的vCore数都未奏效。有人会因此错误的认为Yarn上的一个vCore对应一个Spark的executor,这是非常错误的,正确的

Laurence的技术博客 916

Android平台的音乐资源管理与播放

    Android平台基于Linux和开放手机联盟(OHA)系统,经过中国移动的创新研发,设计出拥有新颖独特的用户操作界面,增强了浏览器能力和WAP 兼容性,优化了多媒体领域的OpenCORE、浏览器领域的WebKit等业内众多知名引擎,增加了包括游戏、Widget、Java ME等在内的先进平台中间件。本文主要介绍如何利用OPhone平台提供的多媒体编程环境进行音乐资源的管理与播放。 ...

weixin_34186950的博客 101

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android 项目之--Mini音乐播放器

<br />源自:http://dev.10086.cn/cmdn/bbs/thread-18399-1-1.html)<br />上篇文章讲服务的例子中,有个演示服务的后台播放音乐,今天就来讲一讲多媒体之一的音乐播放。  说到多媒体不得不向上追溯,空间多媒体是如何实现的,如何可以让我们轻松的播放音乐、视频?本章讲述点大致如下:1、什么是Open Core? 2、Open Core 的具体功能。 3、Mediaplayer 介绍   3.1、MediaPlayer 方法介绍 4、完整音乐播放例子演示 5、A

有家客栈 君子不器 1242

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

对MediaPlayer,简易的音乐播放器

MediaPlayer 类是用来播放音频,视频和流媒体的,

u013387330的专栏 421

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

如何写一个正经的Android音乐播放器 一

以前写过很多次音乐播放器,但是总有一些问题出现,例如: 1,音乐长时间播放问题(即便是放在service中去播放,依然会被杀死); 2,音乐的播放进度如何掌握?(如何利用mediaplayer.getCurrentPosition()来有效的通知界面变更进度?);  3,在我以往的经验中,音乐播放完毕下一曲时候,经常出现当前音乐播放还差几秒钟的时候就下一曲了的情况。 从网上找到教程中,通常

boybeak的专栏 1万+

多媒体编程

多媒体编程 文字、图片、音频、视频(这里仅仅对银频和视频详解) 音频播放器创建方法方式一、 MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); mediaPlayer.start(); // no need to call prepare(); create() does that for you 方式

BriskLyer的博客 3344

Android学习整理_Server简单应用.音乐播放器

Android学习整理_Service简单应用.音乐播放器 1.因为我们需要使用Service,所以我们需要在AndroidManifest.xml文件中定义好. <!-- 我们会规定设置调用music.java的动作名为这个

小小拳大大脚 1207

播放在线网络音乐

播放在线网络音乐找到网络音乐的url,比如http://zhangmenshiting.qianqian.com/data2/music/247912201/2479116541515704461128.mp3?xcode=d7e6285ed0867364f4316fffb8ff8771 1.第一种: val uri = Uri.parse("http://zhangmens

Veng的博客 997

Android播播放完SD卡指定文件夹音乐之后,自动播放下一首

最近做一个项目,需要连续播放音乐,播放完一首歌之后,自动播放完下一首歌。不要重复播放。 代码如下: package com.example.asyncplayer_ex; import java.io.IOException; import java.util.ArrayList; import javax.security.auth.PrivateCredenti...

weixin_30680385的博客 266
上一篇: Android多媒体编程——图片的操作与处理
下一篇: Android视频播放框架——封装FFMPEG的Vitamio
ProbuINg
博客等级 码龄14年 10粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值