Android音频技术介绍外文翻译资料
2023-03-03 22:52:50
第五章
Android音频技术介绍
现如今,任何叫得上名字的智能手机都有可以与专用的便携式设备或者MP3播放器相提并论的音频播放功能。当然,Android 智能设备也不例外。这些功能允许了音乐播放、有声书、广播或者是其他任何以音频播放为中心的应用类型的存在。
在这一章节中,我们将探讨Android在格式条款和编解码器上的支持能力,并且我们会开发几个不同的音频播放应用。此外,我们将研究Android在音频格式和元数据上的支持情况。
音频播放
就像之前说的,Android支持能与MP3播放器相并论的音频播放能力。事实上,它可能更进一步,因为它支持一个相当广泛的音频格式,比大部分硬件播放设备都要多。智能手机好处之一就是具备以前只能由专用的硬件设备完成的功能,因为它有运行各种软件的良好设施;就像电脑一样,他们可以对不同或者时刻变化的不适合去建设以硬件为中心的固件设备的技术提供广泛的支持。
支持的音频格式
Android 支持多种音频文件格式和音频播放编解码器(它支持的录音文件格式少一些,这些我们会在之后讲到录音时再讨论)。
AAC: 高级音频编码(同时包括HEAAC,高效率AAC) .m4a (audio/m4a) 或.3gp (audio/3gpp) 文件。AAC是一个被iPod及其他便携多媒体播放器使用的流行标准。Android在MPEG-4音频文件及3GP文件(它是基于MPEG-4格式的)中对这种音频提供支持。最近对AAC规格的添加改进,使得高效率AAC同样可以被支持。
MP3: MPEG-1音频层3, .mp3 (audio/mp3) 文件。 MP3, 大概是被使用最为广泛的音频编码,在Android上也是支持的。这使得Android能播放绝大多数通过网页及音乐商店这些在线途径获取的音频。
AMR: 自适应多速率音频编码 (包括窄频AMR, AMR-NB,及宽频AMR,AMR-WB),.3gp (audio/3gpp) 或 .amr (audio/amr)文件。AMR是一种被3GPP(第三代合作伙伴计划)规范化为使用中首选的声音音频编码的音频编码格式。3GPP是一个创建行业规范供行业伙伴使用的电信工业组织。换句话说,AMR是主要用于现代手机音频通话应用的编码格式,并且它是被跨手机制造商和运营商支持的。如此,这种音频编码格式对声音编码会很有用,但在更复杂的音频类型比如音乐上的表现就不那么好了。
Ogg: Ogg 免费音乐格式, .ogg (application/ogg) 文件. Ogg 免费音乐格式是一种开源的、无专利的音频编码格式,它的质量可以和商业的、有专利的编码格式诸如MP3和AAC相提并论。它由志愿者开发,目前由Xiph.Org基金会维护。
PCM: 脉冲编码调制波,通常运用在WAVE 或 WAV 文件(波形音频格式), .wav (audio/x-wav) 文件。PCM是用于在计算机和其他数字音频上存储音频的技术。它通常是带有表示随着时间的推移一段音频的幅度变化情况的数据的未压缩的音频文件。“采样速率”表示一个振幅读数的存储频率。“位深度”指有多少位被用于表示一个单独的样品。一段音频数据的采样率为16Hz,位深度为32位表示它包含32位的数据来表示音频的振幅,并且每秒钟有16000次振动。采样率和位深度越高,音频的数字化越精确。采样率和位深度也决定了当长度一定时,音频文件的大小。 Android在WAV文件中支持PCM音频编码格式。WAV是PC端上一个长期的标准音频格式。
联网使用自带的音频播放器
就像使用相机,要让应用具有提供播放音频文件的能力的最简单的方法就是利用内置的音乐播放器应用的功能。这个应用能播放Android支持的所有音频格式,并且带有用户熟悉的界面,也能够被用来联网播放指定的文件。
带有包含音频文件数据的Uri及MIME类型的通用android.content.Intent.ACTION_VIEW intent能让Android选择合适的应用程序来播放音频。一般来说这个应用程序会是音乐,但如果用户安装了其他音频播放软件的话则会有更多选择。
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(audioFileUri, 'audio/mp3');
startActivity(intent);
注释:MIME指多功能网际邮件扩充协议。它最初是用来帮助邮件用户收发附件的。它的使用,不仅极大扩展了邮件的使用,还有其他的通信协议,包括HTTP或者标准网络服务。当解析Intent时,Android会使用MIME类型来判断由哪个应用程序来处理这个Intent。每一个文件类型都有一个(有时有多个)特定的MIME类型。这个类型会指定使用至少两个互相之间存在削减的部件。第一个部件是一个更通用的类型,例如“audio”,第二个部件是更具体的类型,比如“mpeg”。一个通用类型“audio”和一个更具体的类型“mpeg”会产生一个由“audio/mpeg”字符串表示的MIME类型,这种MIME类型通常被用于MP3文件。
以下是一个用Intent触发内置音频播放器应用的完整示例:
package com.apress.proandroidmedia.ch5.intentaudioplayer;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
我们的activity将会在按键触发播放音频前感知它的按压,这个activity继承OnClickListener,所以它可以作出回应。
public class AudioPlayer extends Activity implements OnClickListener {
Button playButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
当我们给XML设置好内容视图后,我们可以在代码中获取按键的引用,并将activity(当前)设置到OnClickListener上。
playButton = (Button) this.findViewById(R.id.Button01);
playButton.setOnClickListener(this);
}
当按键被点击时,onClick方法会被调用。在这个方法中,我们用类的android.content.Intent.ACTION_VIEW构建intent,并创建一个File对象,这个对象是一个对存在于SD卡上的音频文件的引用。在这个例子中,这个音频文件存放于SD卡上的“Music”目录下,这个目录是与音乐相关的音频文件存放的标准位置。
public void onClick(View v) {
Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
File sdcard = Environment.getExternalStorageDirectory();
File audioFile =
new File(sdcard.getPath() '/Music/goodmorningandroid.mp3');
接下来,我们将把intent的数据设置为由音频文件传递来的Uri,把类型设置为它的MIME类型,audio/mp3。最后,我们通过startActivity命令传输intent来启动内置应用。图5-1为内置应用播放音频文件。
intent.setDataAndType(Uri.fromFile(audioFile), 'audio/mp3');
startActivity(intent);
}
}
图5-1,Android的自带音乐播放器联网播放音频指定文件
以下是一个简单的包含一个带有文本“播放音频”的按键的
Layout XML文件,它会在前述的activity中被用到。
lt;?xml version='1.0' encoding='utf-8'?gt;
lt;LinearLayout xmlns:android='http://schemas.android.com/apk/res/android'
android:orientation='vertical'
android:layout_width='fill_parent'
android:layout_height='fill_parent'
gt;
lt;Button android:text='Play Audio' android:id='@ id/Button01'
android:layout_width='wrap_content' android:layout_height='wrap_content'gt;lt;/Buttongt;
lt;/LinearLayoutgt;
创建一个自定义音频播放应用
当然,我们不是限制到只能用Android内置的应用来播放音频,我们可以写一个我们自己的应用来播放音频甚至做更多事。
为了实现这些功能,Android提供了MediaPlayer类。这个类能用来播放和控制音频和视频。现在我们只用播放音频的功能。
最简单的MediaPlayer例子是利用包装好的应用本身播放音频文件。为了做到这一点,音频文件需要被存放在应用的原生资源下。用Eclipse上的Android开发者工具完成这些时,我们需要在我们的项目的res文件夹下创建一个叫raw的文件夹,如图5-2。Android开发者工具会用R.raw.file_name_without_extension句法为这个文件在R.java文件(在gen文件夹下)中生成一个资源id。
图5-2,自定义音频播放器Eclipse工程布局展示音频文件存放在res文件夹下的raw文件夹中
启动音频播放
给音频文件创建一个MediaPlayer对象是直截了当的,我们用静态方法create实例化一个MediaPlayer对象,将这作为音频文件的一个Context(Activity起源于此)和生成的资源ID。
MediaPlayer mediaPlayer =
MediaPlayer.create(this, R.raw.goodmorningandroid);
接着,我们只需用MediaPlayer对象调用start方法来播放它。
mediaPlayer.start();
————————————— 本地资源 ————————————
当在Android开发者工具/Eclipse工程的res文件夹下存放资源时,以下这些必须考虑:文件扩展名和使用Uris。
文件扩展名
扩展名被删除,则具有相同基础名称而扩展名不同的文件会造成一些问题。所以你最好不要创建一个叫goodmorningandroid.mp3文件的同时创建一个叫goodmorningandroid.m4a的文件。相反,如果你想为一个相同的音频提供不同格式,如果你能将格式作为文件名的一部分会更好,这样你能区分它们的同时,Android开发者工具在生成资源ID的时候也不会有麻烦。如果你将它们命名为goodmorningandroid_mp3.mp3 和 goodmorningandroid_m4a.m4a,你可以分别以R.raw.goodmorningandroid_mp3和R.raw.goodmorningandroid_m4a引用它们。
资源文件的Uris
虽然资源ID在某些时候很好用,但不是适合所有场合。就如我们已经知道的,在Android中可以利用Uri完成很多事情。辛运的是,给存放在资源下的文件构建Uri是很简单的。资源ID可以附加当字符串尾端,我们可以用这一点来构建Uri。字符串必须以android.resource://开头,紧跟上能标识资源的应用的包名,再跟上文件的资源ID。
举例如下:
Uri fileUri = Uri.parse
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[146422],资料为PDF文档或Word文档,PDF文档可免费转换为Word