66
77- 什么是多媒体
88
9- 多媒体是计算机和视频技术的结合,实际上它是两个媒体; 声音和图像,或者用现在的术语:音响和电视
9+ 多媒体是计算机和视频技术的结合,实际上它是两个媒体: 声音和图像
1010
1111- 常用的视频格式
1212
13- Android系统默认: mp4、 3gp
14- 常用格式: ts、3gpp、3g2、3gpp2、avi、mkv、flv、divx、f4v、rm、rmvb、rv、wmv、asf、mov、mpg、v8、ram、mpeg、
15- swf、m2v、asx、ra、ram、ndivx、xvid等
13+ `Android`系统默认:` mp4`、` 3gp`
14+ 常用格式:` ts、3gpp、3g2、3gpp2、avi、mkv、flv、divx、f4v、rm、rmvb、rv、wmv、asf、mov、mpg、v8、ram、mpeg、
15+ swf、m2v、asx、ra、ram、ndivx、xvid`等
1616
1717- 常用音频格式:
1818
19- Android系统: mp3、ogg;
20- 常用格式: wma、mid、m4a、xmf、aac、mpa、midi、ar等
19+ `Android`系统:` mp3、ogg`
20+ 常用格式:` wma、mid、m4a、xmf、aac、mpa、midi、ar`等
2121
22- - 常用图片格式: PNG、GIF、BMP、jpg
22+ - 常用图片格式: ` PNG、GIF、BMP、jpg `
2323
24- - 国内各个视频网站采用的解码框架:
24+ - 国内各个视频网站采用的解码框架:
2525
26- - 优酷、搜狐、奇艺、pps、暴风影音土豆、56网都是用的ffmpeg .
27- - pptv已经使用p2p技术
28- 点对点技术(peer-to-peer, 简称P2P )又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,
29- 而不是把依赖都聚集在较少的几台服务器上。P2P网络通常用于通过Ad Hoc连接来连接节点 。这类网络可以用于多种用途,
30- 各种档案分享软件已经得到了广泛的使用。P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中 。
26+ - 优酷、搜狐、奇艺、` pps` 、暴风影音土豆、56网都是用的`ffmpeg` .
27+ - `pptv`已经使用`p2p`技术
28+ 点对点技术(` peer-to-peer`, 简称`P2P` )又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,
29+ 而不是把依赖都聚集在较少的几台服务器上。`P2P`网络通常用于通过`Ad Hoc`连接来连接节点 。这类网络可以用于多种用途,
30+ 各种档案分享软件已经得到了广泛的使用。`P2P`技术也被使用在类似`VoIP`等实时媒体业务的数据通信中 。
3131
32- 目前常用的开发框架:
33-
34- - VLC框架:
35- VLC是一个开源项目,基于ffmpeg框架的自定义播放器。其中LibVLC是VLC的核心部分,就相当于MediaPlayer类
36- VLC一个最主要的部分 ,它可以播放各种类型的媒体文件和流媒体文件,并且可以创造媒体流并保存成各种格式的媒体文件
37- VLC是一种跨平台的媒体播放器和流媒体服务器,最初为videolan的客户端 ,它是一种非常简便的多媒体播放器,
38- 它可以用来播放各种各样的音视频的格式文件(MPEG-1、MPEG-2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC等等 )流媒体协议
39- 最具特色的功能是可以边下载边观看Divx媒体文件,并可以播放不完全的AVI文件 。并且支持界面的更改。
40- 缺点:有C /C++代码,还有Java代码 ,代码太庞大
32+ 目前常用的开发框架:
33+
34+ - ` VLC ` 框架:
35+ `VLC`是一个开源项目,基于`ffmpeg`框架的自定义播放器。其中`LibVLC`是`VLC`的核心部分,就相当于`MediaPlayer`类
36+ `VLC`一个最主要的部分 ,它可以播放各种类型的媒体文件和流媒体文件,并且可以创造媒体流并保存成各种格式的媒体文件
37+ `VLC`是一种跨平台的媒体播放器和流媒体服务器,最初为`videolan`的客户端 ,它是一种非常简便的多媒体播放器,
38+ 它可以用来播放各种各样的音视频的格式文件(` MPEG-1、MPEG-2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC`等等 )流媒体协议
39+ 最具特色的功能是可以边下载边观看`Divx`媒体文件,并可以播放不完全的`AVI`文件 。并且支持界面的更改。
40+ 缺点:有`C /C++` 代码,还有`Java`代码 ,代码太庞大
4141
42- - ffmpeg框架:
43- 优点: 轻量级框架,易于维护
44- FFmpeg是一个集录制 、转换、音/视频编码解码功能为一体的完整的开源解决方案
45- FFMPEG几乎为你把所有的繁重工作都做了 ,比如解码、编码、复用和解复用。
46- 这使得多媒体应用程序变得容易编写。它是一个简单的,用C编写的 ,快速的并且能够解码几乎所有你能用到的格式,当然也包括编码多种格式。
47- FFmpeg支持MPEG 、DivX、MPEG4、AC3、DV、FLV等40多种编码,支持AVI 、MPEG、OGG、Matroska、ASF等90多种解码
48- FFmpeg主目录下主要有libavcodec、libavformat和libavutil等子目录。其中libavcodec用于存放各个encode/decode模块
49- libavformat用于存放muxer/demuxer模块,libavutil用于存放内存操作等辅助性模块
42+ - ` ffmpeg ` 框架:
43+ 优点: 轻量级框架,易于维护
44+ `FFmpeg`是一个集录制 、转换、音/视频编码解码功能为一体的完整的开源解决方案
45+ `FFmpeg`几乎为你把所有的繁重工作都做了 ,比如解码、编码、复用和解复用。
46+ 这使得多媒体应用程序变得容易编写。它是一个简单的,用`C`编写的 ,快速的并且能够解码几乎所有你能用到的格式,当然也包括编码多种格式。
47+ `FFmpeg`支持`MPEG 、DivX、MPEG4、AC3、DV、FLV`等40多种编码,支持`AVI 、MPEG、OGG、Matroska、AS`F等90多种解码
48+ `FFmpeg`主目录下主要有`libavcodec、libavformat`和`libavutil`等子目录。其中`libavcodec`用于存放各个`encode/decode`模块
49+ `libavformat`用于存放`muxer/demuxer`模块,`libavutil`用于存放内存操作等辅助性模块
5050
51- - vitamio框架:
52- vitamio也是基于ffmpeg开源框架
53- VPlayer是vitamio的一个产品,vitamio和VPlayer是同一个团队开发的,VPlayer能播放的vitamio也能播放
51+ - ` vitamio ` 框架:
52+ `vitamio`也是基于`ffmpeg`开源框架
53+ `VPlayer`是`vitamio`的一个产品,`vitamio`和`VPlayer`是同一个团队开发的,`VPlayer`能播放的`vitamio`也能播放
5454
5555
56- ##Surface简介
56+ ## ` Surface ` 简介
57+
5758- ` Surface ` 就是“表面”的意思。在` SDK ` 的文档中,对` Surface ` 的描述是这样的:“` Handle onto a raw buffer that is being managed by the screen compositor ` ”,
58- 翻译成中文就是“由屏幕显示内容合成器`(screen compositor)`所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
59- - 通过Surface(因为Surface是句柄)就可以获得原生缓冲器以及其中的内容。就像在C语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
60- - 原生缓冲器(rawbuffer)是用于保存当前窗口的像素数据的。
59+ 翻译成中文就是“由屏幕显示内容合成器`(screen compositor)`所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:
60+
61+ - 通过`Surface`(因为`Surface`是句柄)就可以获得原生缓冲器以及其中的内容。就像在`C`语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
62+ - 原生缓冲器(`rawbuffer`)是用于保存当前窗口的像素数据的。
63+
6164- 简单的说` Surface ` 对应了一块屏幕缓冲区,每个` Window ` 对应一个` Surface ` ,任何` View ` 都是画在` Surface ` 上的,传统的` view ` 共享一块屏幕缓冲区,所有的绘制必须在` UI ` 线程中进行
62- - 我们不能直接操作Surface实例,要通过SurfaceHolder,在SurfaceView中可以通过getHolder()方法获取到SurfaceHolder实例 。
65+ - 我们不能直接操作 ` Surface ` 实例,要通过 ` SurfaceHolder ` ,在 ` SurfaceView ` 中可以通过 ` getHolder() ` 方法获取到 ` SurfaceHolder ` 实例 。
6366- ` Surface ` 是一个用来画图形的地方,但是我们知道画图都是在一个` Canvas ` 对象上面进行的,* ` Surface ` 中的` Canvas ` 成员,是专门用于提供画图的地方,就像黑板一样,其中的原始缓冲区是用来保存数据的地方,
6467 `Surface`本身的作用类似一个句柄,得到了这个句柄就可以得到其中的`Canvas`、原始缓冲区以及其他方面的内容,所以简单的说`Surface`是用来管理数据的(句柄)*。
6568
66- ## SurfaceView简介
69+ ## ` SurfaceView ` 简介
70+
6771- 简单的说` SurfaceView ` 就是一个有` Surface ` 的` View ` 里面内嵌了一个专门用于绘制的` Surface ` ,` SurfaceView ` 控制这个` Surface ` 的格式和尺寸以及绘制位置.` SurfaceView ` 是一个` View ` 也许不够严谨,
6872 然而从定义中 `public class SurfaceView extends View`显示`SurfaceView`确实是派生自`View`,但是`SurfaceView`却有着自己的`Surface`,源码:
6973 ```java
70- if (mWindow == null) {
74+ if (mWindow == null) { ß
7175 mWindow = new MyWindow(this);
7276 mLayout.type = mWindowType;
7377 mLayout.gravity = Gravity.LEFT|Gravity.TOP;
8286- ` Surface ` 是纵深排序` (Z-ordered) ` 的,这表明它总在自己所在窗口的后面。
8387- ` Surfaceview ` 提供了一个可见区域,只有在这个可见区域内的` Surface ` 部分内容才可见,可见区域外的部分不可见,所以可以认为** ` SurfaceView ` 就是展示` Surface ` 中数据的地方** ,` Surface ` 就是管理数据的地方,
8488 `SurfaceView`就是展示数据的地方,只有通过`SurfaceView`才能展现`Surface`中的数据。
85- 
89+
90+ 
91+
92+
8693- ` Surface ` 的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者` Surface ` 的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物` (overlays) ` (例如,文本和按钮等控件)。
87- 注意,如果`Surface`上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁 。
88- 这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated (SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
94+ 注意,如果`Surface`上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。`surfaceview`变得可见时,`surface`被创建;`surfaceview`隐藏前,`surface`被销毁 。
95+ 这样能节省资源。如果你要查看`surface`被创建和销毁的时机,可以重载`surfaceCreated (SurfaceHolder)`和` surfaceDestroyed(SurfaceHolder)` 。
8996 **`SurfaceView`的核心在于提供了两个线程:`UI`线程和渲染线程**,两个线程通过“双缓冲”机制来达到高效的界面适时更新。
9097
91- ## SurfaceHolder简介
98+ ## ` SurfaceHolder ` 简介
9299
93100显示一个` Surface ` 的抽象接口,使你可以控制` Surface ` 的大小和格式以及在` Surface ` 上编辑像素,和监视` Surace ` 的改变。这个接口通常通过` SurfaceView ` 类实现。
94101简单的说就是我们无法直接操作` Surface ` 只能通过` SurfaceHolder ` 这个接口来获取和操作` Surface ` 。
95- SurfaceHolder` 中提供了一些 ` lockCanvas()`:获取一个Canvas对象 ,并锁定之。所得到的Canvas对象,其实就是Surface中一个成员 。加锁的目的其实就是为了在绘制的过程中,
96- Surface中的数据不会被改变。lockCanvas是为了防止同一时刻多个线程对同一canvas写入 。
102+ ` SurfaceHolder ` 中提供了一些` lockCanvas() ` :获取一个 ` Canvas ` 对象 ,并锁定之。所得到的 ` Canvas ` 对象,其实就是 ` Surface ` 中一个成员 。加锁的目的其实就是为了在绘制的过程中,
103+ ` Surface ` 中的数据不会被改变。 ` lockCanvas ` 是为了防止同一时刻多个线程对同一 ` canvas ` 写入 。
97104
98105
99106* 从设计模式的角度来看,` Surface、SurfaceView、SurfaceHolder ` 实质上就是` MVC(Model-View-Controller) ` ,` Model ` 就是模型或者说是数据模型,更简单的可以理解成数据,在这里也就是` Surface ` ,
@@ -107,7 +114,7 @@ Surface中的数据不会被改变。lockCanvas是为了防止同一时刻多个
107114 如果当前的`MediaController`只是播放前下面的控制栏部分(进度条、快进、快退、暂停等)这样我们可以通过对VideoView设置点击事件,控制它的显示和隐藏。
108115 如果`MediaController`为整个屏幕包括了控制栏部分、上端的信息显示部分、以及左右栏的功能部分、这时候就可以通过对`MediaController`本身设置点击事件来控制显示和隐藏。
109116
110- ` Controller ` 可以用` PopupWindow ` 来实现,具体有两种方式:
117+ ` Controller ` 可以用` PopupWindow ` 来实现,具体有两种方式:
111118
112119- 整个控制栏(上面的信息部分、下面的控制部分以及左右边)都在` Controller ` 中,` setAnchorView() ` 的时候就会让` Controller ` 中的` PopupWindow ` 显示出来(一直显示,但是这个` PopupWindow ` 是透明的),
113120 真正的显示与隐藏是控制在`PopupWindow`中的`View`部分的显示与隐藏来实现。开始的时候我是想用这种方式,当时我想的是播放就播放、控制就控制,分离开来多好,但是没想到,
0 commit comments