MediaPlayer

简介: MediaPlayer

1.MediaPlayer

使用MediaPlayer

媒体框架最重要的组件之一是MediaPlayer类。这个类的对象可以使用最少的设置获取、解码和播放音频和视频。它支持几种不同的媒体来源,如:

  • 本地资源
  • 内部uri,例如您可能从contentProvider获得的uri
  • 外部url(流) 有关Android支持的媒体格式列表,请参阅支持的媒体格式页面。

下面是如何播放本地音频资源(保存在您的应用程序的res/raw/目录中):

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);

mediaPlayer.start(); // no need to call prepare(); create() does that for you

在本例中,“raw”资源是系统不尝试以任何特定方式解析的文件。然而,这个资源的内容不应该是原始音频。它应该是一个以支持的格式之一适当编码和格式化的媒体文件。

下面是您如何从系统中本地可用的URI(例如,您通过内容解析器获得的URI)进行播放:

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

通过HTTP流媒体从远程URL播放如下:

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();


注意:如果要通过一个URL来传输流媒体在线文件,该文件必须能够逐步下载。注意:在使用setDataSource()时,您必须捕获或传递IllegalArgumentException和IOException,因为您引用的文件可能不存在。

代码位于:/frameworks/base/media/java/android/media/MediaPlayer.java

静态代码块如下:最先执行

static {
        System.loadLibrary("media_jni");
        native_init();
    }

初始化

MediaPlayer(Java)对象有自己的本地方法, 其位于frameworks/base/media/jni/android_media_MediaPlayer.cpp中, 这些方法均以android_media_MediaPlayer_开头, 因此"native_init"对应android_media_MediaPlayer_native_init().

MediaPlayer在构造时会做两件事情:

在加载libmedia_jni.so并执行native_init(), 这个步骤只获取MediaPlayer类相关的一些信息, 并不会初始化 C++ 对象

其native方法native_setup()接下来被调用, 这个步骤负责实例化一个MediaPlayer(C++)类, 并生成一个集成自MediaPlayerListener的JNIMediaPlayerListener用于监听来自播放器的消息. 新创建的MediaPlayer(C++)对象将被保存在MediaPlayer(Java)的mNativeContext中用于后续的下行调用.

MediaPlayer的初始化比较简单, 只有设置数据源之后才能开始 解封装 / 解码 / 渲染 等的工作.


目录
相关文章
|
JavaScript 算法
Vue的数据为什么频繁变化但只会更新一次
Vue的数据为什么频繁变化但只会更新一次
362 1
|
6月前
|
关系型数据库 虚拟化 UED
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
244 7
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
|
小程序 搜索推荐 JavaScript
微信小程序使用Vant
微信小程序使用Vant
474 2
|
安全 芯片 SoC
两节锂电池充电芯片和充放电电路如何设计
两节锂电池充电电路设计中,A部分为保护电路,监测电压电流防止电池受损或膨胀;B部分负责电池充电管理,提供过压保护但不过放电保护;C部分则处理电池放电,实现不同电压转换输出。常见充电芯片如PW4284集成USB输入与DC-DC升压,支持8.4V充满及1A输出,并含过压保护。设计中需注意合理布局,如减少噪声干扰和确保功率线宽裕。此外,为保证安全,即便有充电管理芯片,仍需独立的充放电保护电路,如PW7052,来实现全面的电池保护。
两节锂电池充电芯片和充放电电路如何设计
|
11月前
|
Web App开发 XML 网络协议
|
存储 索引
数组的特点
数组是一种线性数据结构,用于存储固定大小的顺序集合。每个元素在数组中都有一个唯一的索引,可以快速访问和修改。数组支持随机访问,但插入和删除操作较慢,因为需要移动后续元素。适用于需要频繁读取数据的场景。
|
JavaScript 前端开发 网络安全
Node.js和php
【8月更文挑战第4天】Node.js和php
192 3
|
自然语言处理 搜索推荐 数据挖掘
电商 API 接口:电商领域的强大技术引擎
在数字化浪潮中,电商API接口作为连接系统的桥梁,已成为电商市场的核心技术引擎。它通过实时库存信息、多样化支付等功能提升用户体验,支持自动化订单处理,促进数据流通与分析,并允许定制化开发,集成移动应用,从而增强系统灵活性和业务竞争力。
|
传感器 人工智能 自然语言处理
AI智能家居系统如何实现自动化控制?
【6月更文挑战第23天】AI智能家居系统如何实现自动化控制?
622 7
|
安全 算法 数据安全/隐私保护
探索Android 12中的隐私保护新特性
【6月更文挑战第30天】随着数字时代的到来,个人数据安全和隐私保护日益成为用户关注的焦点。本文将深入探讨Android 12操作系统中引入的隐私保护功能,从全新的隐私仪表板到精细的应用权限管理,再到增强的系统安全性,我们将逐一分析这些新特性如何提升用户的隐私保护水平,并讨论它们对开发者和用户体验可能产生的影响。