重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Android的多媒体框架包括支持播放多种常见的媒体类型,可以轻松地把音频、视频和图像集成到你的应用。可以播放音频或视频媒体文件,这些文件是存储在你的应用程序的资源文件中的。应用程序的资源文件可以是文件系统中独立的文件,或通过网络连接获取的一个数据流,所有使用MediaPlayer APIS的资源文件,是谷歌自带的播放器
在华龙等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都网站制作 网站设计制作按需定制,公司网站建设,企业网站建设,品牌网站设计,成都营销网站建设,成都外贸网站制作,华龙网站建设费用合理。
那你就在98的时候关掉它不可以吗?按正常的视频缓冲差不多是在90多的时候就会开始播放了,要么你就控制它的播放,你在缓冲的时候暂停视频,在缓冲到100 的时候就掉开始的函数,开始播放然后关掉ProgressDialog
android应用开发框架是 Application Framework. 其系统架构由5部分组成,分别是:Linux Kernel、Android Runtime、Libraries、Application Framework、Applications。第二部分将详细介绍这5个部分。下面自底向上分析各层。
Android架构
1、Linux Kernel
Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。 如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各尽其职,各层提供固定的SAP(Service Access Point),专业点可以说是高内聚、低耦合。 如果你只是做应用开发,就不需要深入了解Linux Kernel层。
2、Android Runtime
Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以将 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。 Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。
3、Libraries
Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库: 系统C库--标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备 媒体库--基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG 界面管理--管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层 LibWebCore--新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图 SGL--基本的2D图形引擎 3D库--基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅 FreeType --位图和矢量字体渲染 SQLite --所有应用程序都可以使用的强大而轻量级的关系数据库引擎
4、Application Framework
通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。 开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用 ,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。 所有的应用程序其实是一组服务和系统,包括: 视图(View)--丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器 内容提供者(Content Providers)--使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据 资源管理器(Resource Manager)--提供访问非代码资源,如本地化字符串、图形和布局文件 通知管理器(Notification Manager)--使所有的应用程序能够在状态栏显示自定义警告 活动管理器(Activity Manager)--管理应用程序生命周期,提供通用的导航回退功能
5、Applications
Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发! 从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆迭(Software Stack),或称为「软件迭层架构」,迭层主要分成三层:操作系统、中间件、应用程序。从上面我们也看到了开源的力量,一个个熟悉的开源软件在这里贡献了自己的一份力量。
Vitamio 是一款 Android 平台上的全能多媒体开发框架。Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐。
Vitamio 能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在 Android 上支持 MMS, RTSP, RTMP, HLS(m3u8) 等常见的多种视频流媒体协议,包括点播与直播。
支持 ARMv6 和 ARMv7 两种 ARM CPU,同时对 VFP, VFPv3, NEON 等指令集都做相应优化。
第一、Vitamino框架的导入
1.开源项目的git地址
2.下载完成后项目结构
3.导入目录结构中的vitmio文件夹
3.1快捷键Ctrl+Alt+Shift+S进入如下界面,选择红框的+
3.2选择+出现如下界面,根据下图操作
3.3导入成功之后,在app的build.gradle中配置如下
compile project(':vitamio')
4.在AndroidMainfest中配置如下
uses-permission android:name="android.permission.WAKE_LOCK" /
uses-permission android:name="android.permission.INTERNET" /
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /
activity
android:name="io.vov.vitamio.activity.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden"/activity
第二、框架的使用demo
1.demo的git地址:
2.项目的初始化
Vitamio.initialize(MainActivity.this);
3.xml配置
io.vov.vitamio.widget.VideoView
android:id="@+id/video_view_vitamio"
android:layout_width="match_parent"
android:layout_height="match_parent" /
4.vitamio的使用
private VideoView videoView = null;
String videoPath = "
String secondPath = "
private FrameLayout mVideoContanier = null;
private ImageView mIvThumbnail = null;
private ImageView mIvPlay = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.vitamio);
if (!LibsChecker.checkVitamioLibs(this)) {
Toast.makeText(VitamioActivity.this, "Vitamio未初始化OK", Toast.LENGTH_SHORT).show();
return;
}
videoView = (VideoView) findViewById(R.id.video_view_vitamio);
mVideoContanier = (FrameLayout) findViewById(R.id.fl_layout_vitamio);
mIvThumbnail = (ImageView) findViewById(R.id.iv_video_thumbnail);
mIvPlay = (ImageView) findViewById(R.id.iv_video_start);
setThumbnail();
videoView.setVideoURI(Uri.parse(secondPath));
mIvPlay.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_video_start:
//点击开始隐藏缩略图和开始图标
mIvThumbnail.setVisibility(View.GONE);
mIvPlay.setVisibility(View.GONE);
//准备视频播放
MediaController mediaController = new MediaController(VitamioActivity.this, true, mVideoContanier);
videoView.setMediaController(mediaController);
videoView.setOnPreparedListener(this);
videoView.setOnCompletionListener(this);
videoView.setOnErrorListener(this);
break;
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(VitamioActivity.this, "横屏", Toast.LENGTH_SHORT).show();
//去掉系统通知栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//调整视频layout的布局
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mVideoContanier.setLayoutParams(layoutParams);
//原视频大小
// public static final int VIDEO_LAYOUT_ORIGIN = 0;
//最优选择,由于比例问题还是会离屏幕边缘有一点间距,所以最好把父View的背景设置为黑色会好一点
// public static final int VIDEO_LAYOUT_SCALE = 1;
//拉伸,可能导致变形
// public static final int VIDEO_LAYOUT_STRETCH = 2;
//会放大可能超出屏幕
// public static final int VIDEO_LAYOUT_ZOOM = 3;
//效果还是竖屏大小(字面意思是填充父View)
// public static final int VIDEO_LAYOUT_FIT_PARENT = 4;
videoView.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0);
} else {
/*清除flag,恢复显示系统状态栏*/
Toast.makeText(VitamioActivity.this, "竖屏", Toast.LENGTH_SHORT).show();
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, PixelUtils.dip2px(getApplicationContext(), 220));
mVideoContanier.setLayoutParams(layoutParams);
}
super.onConfigurationChanged(newConfig);
}
/**
* 设置缩略图
*/
private void setThumbnail() {
new Thread(new Runnable() {
@Override
public void run() {
//设置缩略图,Vitamio提供的工具类。
final Bitmap videoThumbnail = ThumbnailUtils.createVideoThumbnail(
VitamioActivity.this, secondPath
, MediaStore.Video.Thumbnails.MINI_KIND);
if (videoThumbnail != null) {
mIvThumbnail.post(new Runnable() {
@Override
public void run() {
mIvThumbnail.setImageBitmap(videoThumbnail);
}
});
}
}
}).start();
}
@Override
public void onPrepared(MediaPlayer mp) {
Toast.makeText(VitamioActivity.this, "准备好了", Toast.LENGTH_SHORT).show();
videoView.start();
videoView.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0);
}
@Override
public void onCompletion(MediaPlayer mp) {
Toast.makeText(VitamioActivity.this, "播放完了", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(VitamioActivity.this, "Error", Toast.LENGTH_SHORT).show();
return false;
}
Android使用VideoView实现VideoPlayer 在Android系统中,是通过MediaPalyer类播放媒体文件的(包括视频和音频)。虽然这个类已经比较简单了,但是还需要控制各种状态,对于视频还需要设置输出窗口,还是需要仔细研究的。为了避免这些麻烦事儿,Android框架提供了VideoView类来封MediaPalyer,这个VideoView类非常好用。Android自带的程序Gallery也是用VideoView实现的。通过VideoView播放视频的步骤:1、在界面布局文件中定义VideoView组件,或在程序中创建VideoView组件2、调用VideoView的如下两个方法来加载指定的视频setVidePath(String path):加载path文件代表的视频setVideoURI(Uri uri):加载uri所对应的视频 3、调用VideoView的start()、stop()、psuse()方法来控制视频的播放 VideoView通过与MediaController类结合使用,开发者可以不用自己控制播放与暂停简单实例: activity_main/apk/res/android"xmlns:tools="schemas/tools"android:layout_width="match_parent"android:layout_height="match_parent" VideoViewandroid:id="@+id/video1"android:layout_width="match_parent"android:layout_height="match_parent" / /RelativeLayoutActivity 控制代码: package com.Uri; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.MediaController; import android.widget.VideoView;public class MainActivity extends Activity {private VideoView video1;MediaController mediaco;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);video1=(VideoView)findViewById(R.id.video1);mediaco=new MediaController(this);File file=new File("/mnt/sdcard/通话录音/1.mp4");if(file.exists()){//VideoView与MediaController进行关联video1.setVideoPath(file.getAbsolutePath());video1.setMediaController(mediaco);mediaco.setMediaPlayer(video1);//让VideiView获取焦点video1.requestFocus();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}}