Android 平台上音视频系统的研究及播放器开发.pdf(3)

电脑杂谈  发布时间:2019-06-16 15:04:01  来源:网络整理

java.lang.thread 类的实例就是一个线程但是它需要调用java.lang.runnable接口来执行,由于线程类本身就是调用的runnable接口所以你可以继承java.lang.thread 类或者直接调用runnable接口来重写run()方法实现线程。servier端实现ipc接口,client端调用ipc接口本地代理。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中.2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法。

代理类 BpMediaPlayerService 主要通过调用 remote()->transact()来传输数据。客户端中获得 IMediaPlayerService 接口,然后调 用 BpMediaPlayerService ,继而通过 Binder 机制调用了 BnMediaPlayerService ,然 后调用了服务类 MediaPlayerService 。 10Android 平台上音视频系统的研究及播放器开发第三章 音视频系统的研究与扩展11第三章 音视频系统的研究与扩展伴随着搭载有 Android 系统的移动终端设备的增加,Android 平台上音视频系 统的应用也越来越广泛,不但可用于媒体播放器中,还可用于视频会议、视频点 播、数字电视、视频监控等互联网信息服务中。Android 平台上音频和视频系统的 研究重点一般被放在了 Java 应用层,针对音视频系统的底层及整体结构方面的研 究甚少。Android平台上音视频系统能够解码的媒体格式种类和效率越来越不能 满足人们 日益增长的需求,还存在值得改进的地方。本章深入研究了音频和视频 系统的结构,并对音视频系统的 Java 上层、本地库层、服务层及硬件抽象层进行 了分析。

realplayer播放器下载_下载realplayer播放器_realplayer插件

根据分析的结果,通过移植 FFmpeg 框架对音视频系统进行了扩展,使其 能支持多种音视频格式的解析和音视频流的解码。给出了使用扩展后的音视频系 统开发播放器的方案。3.1 音频系统本节在谷歌发布的音频系统源码基础上,对音频系统结构、音频系统的各个 层次功能、各层次中涉及的关建类进行了详细的分析。依据 Android系统架构, 衍生了 Android系统中音频系统的,并整理出音频系统各层包含的关键类 及调用关系图,并就各层的功能进行了归纳。本章首先介绍了音频系统的结构, 在随后的各节中顺序对系统结构中的应用程序框架层、本地库 libmedia 层、音频 服务层、音频硬件抽象层等各层的功能和关建类进行了研究和整理。 3.1.1 音频系统结构音频系统主要分为如下几个层次:1.给音频系统的应用层提供调用接口的应用程序框架层。2 .给音频系统提供本地部分接口的 libmedia 本地库层。3 .给音频系统提供服务的中间层,即音频服务层。4 .提供底层支持的硬件抽象层。音频系统的各个层次接口主要提供了播放声音和录制声音两个方面的功能。 如播放音乐时,音乐应用程序会在Java 端发起调用,Java 框架中的MediaPlayer 、 AudioManager 、AudioSystem 等给应用程序的调用提供接口;经过音频文件的格式 解析、音频流的解码,由libmedia 库中的 AudioTrack 传递音频原始数据给音频服 务 AudioFlinger ;AudioFlinger 把所有的音频数据进行 Mixer ,然后将音频数据通 过硬件抽象层和驱动送入到音频硬件设备。

音频系统如图3.1 所示。 12Android 平台上音视频系统的研究及播放器开发Java 音频类AudioManager类 音频应用程序框架层MediaPlayer类AudioTrack类AudioSystem类...音频 JNI 音频本地库层mediaplayer.cpp AudioSystem.cpp AudioTrack.cpp ...通过Binder机制通信MediaPlayerServiceAudioPolicyService音频服务层媒体播放服务AudioFlinger服务音频策略服务音频硬件抽象层接口 音频硬件抽象层音频硬件抽象层实现音频驱动图3.1 音频系统如图3.1 所示,在 Android 中,音频系统自上而下由音频应用程序框架层、音 频本地库层、音频服务层及音频硬件抽象层几个部分组成。下面简单分析一下各 个层次的功能。音频应用程序框架层通过提供一些实现音频相关功能的类为音频应用程序服 务,分布在 frameworks/base/media/java/android/media 目录下,主要有MediaPlayer 、 AudioManager 、AudioService 、AudioSystem 、AudioTrack 等文件。

音频本地库部分的代码分布在 frameworks/base/media/libmedia 和 frameworks/ base/include/media 目 录下 , 主 要 包 含 mediaplayer.cpp 、AudioRecord.cpp 、 AudioSystem.cpp 等文件。本部分内容被编译成库 libmedia.so 作为音频系统的本地 库,通过 JNI 为音频应用程序框架提供接口。音频服务 AudioFlinger 、AudioPolicyService 在 frameworks/base/libs/audioflinger 目录下,这部分内容被编译成库 libaudioflinger.so,它是音频系统的本地服务部分, 基于 Binder 的 IPC 机制为本地库 libmedia 提供接口。音频硬件抽象层的接口在 frameworks/base/libs/audioflinger 目录下,提供到硬 件的接口供 AudioFlinger 调用。音频硬件抽象层的实现在各个系统中可能是不同 的,需要使用代码去继承相应的类并实现他们。图3.2 根据音频系统结构,详细描述了应用程序层、音频应用程序框架层、音 频本地库层、音频服务层及音频硬件抽象层等各个层次的关键类及调用关系。

第三章 音视频系统的研究与扩展13图3.2 音频系统各层包含的关键类及调用关系图如图 3.2 所示,应用程序层包括音乐、视频、电话等音频相关应用程序,调用 音频应用程序框架中的 Java 类实现。音频应用程序框架层提供了实现音频相关功 能的 Java 类供应用程序调用,这些 Java 类通过 JNI 调用本地库 libmedia 中的相应 类来实现。音频本地库中的类通过基于 Binder 的 IPC 机制,调用音频策略服务来 实现音量管理、音频策略管理及输入输出设备管理等功能;调用媒体播放服务 MediaPlayerService 来控制音视频文件的播放并建立播放器 ;调用音频服务 AudioFlinger 来处理音频数据并通过硬件抽象层输出音频数据到音频硬件设备。 14Android 平台上音视频系统的研究及播放器开发 3.1.2 音频系统的应用程序框架层音频系统的应用程序框架层是音频系统的第一层,提供了实现音频相关功能 的 Java 类供应用程序开发者调用,熟悉了这些类的作用,才能在应用程序层调用 他们开发出音频软件。音频应用程序框架层提供的关键类包括 AudioManager 、 AudioService 、MediaPlayer 、AudioTrack 等,下面分类详细介绍他们的功能。

1.音频播放和录制类MediaPlayer 用来控制音视频文件和音视频流的播放。MediaPlayer 通过调用 Surface 和 SurfaceHolder 来显示视频,调用 AudioManager 来调整音视频播放的声 音,提供 start、stop、seekTo 等方法来控制音视频的播放。MediaPlayer 通过调用 底层的媒体播放服务 MediaPlayerService 来实现。MediaPlayer 对音视频文件的播放控制可看作状态机来管理,它有 10 种状 态,在某种状态下不正确的调用其中的方法会产生非法状态异常,如在 Idle 状态 下调用 start()方法就会报错,所以熟悉这些状态是非常必要的[24] 。MediaPlayer 状 态转换图如图 3.3 所示。图3.3 MediaPlayer 状态转换图接下来,对图 3.3 中MediaPlayer 的各个状态进行分析。(1) Idle 状态。创建一个 MediaPlayer 对象或者调用 reset 方法后,MediaPlayer 会处于 Idle 状态。(2) Initialized 状态。

MediaPlayer 对象在 Idle 状态下,调用 setDataSource 方法 可以进入 Initialized 状态,表示此时要播放的文件已经设置好了。(3) Preparing 状态。这是 MediaPlayer 对象从 Initialized 状态转换到 Prepared第三章 音视频系统的研究与扩展15 状态的一个过渡状态。在 Initialized 状态下调用 prepareAsync 方法完成异步准备工 作,进入 Preparing 状态,然后触发 onPrepared 方法进入 Prepared 状态。(4) Prepared 状态。开始播放视频文件前,MediaPlayer 对象必须首先进入 Prepared 状态。有两种方式可以使 MediaPlayer 对象从 Initialized 状态进入 Prepared 状态 ,即同步方式和异步方式。可以调用 prepare 方法 (同步的)或 prepareAsync 方法 (异步的)使其进入 Prepared 状态。异步方式首先转换 MediaPlayer 对象到 Preparing 状态,然后内部播放器调用OnPreparedListener 接口的onPrepared 方法使 其进入 Prepared 状态[25] 。

(5) Started 状态。MediaPlayer 一旦准备好,就可以调用 start 方法开始播放视 频文件,MediaPlayer 对象此时就处于 Started 状态,表明 MediaPlayer 正在播放文 件过程中。在该状态下调用 seekTo 或者 start 方法也可以让 MediaPlayer 对象继续 处于 Started 状态。(6) Paused 状态 。Started 状态下调用 pause方法可以暂停播放,从而使 MediaPlayer 对象进入Paused 状态,播放暂停后可以再次调用 start 方法转到 Started 状态,继续视频文件的播放 。暂停状态下调用 seekTo 或 pause方法都会使 MediaPlayer 对象继续停留在 Paused 状态。(7) PlaybackCompleted状态。如果设置了循环播放,视频播放完毕后就会进入 该状态。此时可以调用 start()方法回到 Started 状态,重新从开头播放视频文件。也 可以调用 stop()方法进入 Stopped 状态 ,停止播放。可以调用 seekTo()来调整播放 位置,完成播放位置的定位后,内部播放器会调用 onSeekComplete()方法。

在 Prepared 、Paused 、 Started 等状态下,也可以调用seekTo()方法来调整播放位置。(8) Stopped状态。Started、Paused 、Paused 及 PlaybackCompleted 状态下均可调 用stop ()方法转换MediaPlayer 对象到Stopped 状态,从而停止播放。而处于Stopped 状态的 MediaPlayer 对象如果想重新播放,需要调用 prepareAsync()或 prepare()方 法回到先前的 Prepared 或 Preparing 状态。(9) Error 状态。不支持的音视频格式、分辨率太高、数据流超时等都会导致某 种播放控制操作失败。开发者在编写程序时,可能会在无效状态下调用某种播放 控制方法导致错误的产生。在这些情况下,错误报告和恢复就成为了一个重要的 问题。在上述的出错情况下,内部播放器会触发 OnErrorListener 接口的 onError() 方法,此时 MediaPlayer进入 Error 状态 。为了重新使用处于 Error状态的 MediaPlayer 对象并且从错误中恢复,可以调用 reset()方法重新回到 Idle 状态。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-106431-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 郭晶晶
      郭晶晶

      #给烊烊520#1128生日评论

    • 杜金金
      杜金金

      我们还可以顺理成章确认这些人工岛符合

    热点图片
    拼命载入中...