视频播放相关内容总结

视频播放相关内容总结

多媒体常识:

  • 什么是多媒体

    多媒体是计算机和视频技术的结合,实际上它是两个媒体;声音和图像,或者用现在的术语:音响和电视

  • 常用的视频格式

    Android系统默认:mp4、3gp

    常用格式:ts、3gpp、3g2、3gpp2、avi、mkv、flv、divx、f4v、rm、rmvb、rv、wmv、asf、mov、mpg、v8、ram、mpeg、

    swf、m2v、asx、ra、ram、ndivx、xvid等

  • 常用音频格式:

    Android系统:mp3、ogg;

    常用格式:wma、mid、m4a、xmf、aac、mpa、midi、ar等

  • 常用图片格式:PNG、GIF、BMP、jpg
  • 国内各个视频网站采用的解码框架:
    • 优酷、搜狐、奇艺、pps、暴风影音土豆、56网都是用的ffmpeg.
    • pptv已经使用p2p技术

      点对点技术(peer-to-peer, 简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,

      而不是把依赖都聚集在较少的几台服务器上。P2P网络通常用于通过Ad Hoc连接来连接节点。这类网络可以用于多种用途,

      各种档案分享软件已经得到了广泛的使用。P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中。

目前常用的开发框架:

  • VLC框架:

    VLC是一个开源项目,基于ffmpeg框架的自定义播放器。其中LibVLC是VLC的核心部分,就相当于MediaPlayer类

    VLC一个最主要的部分,它可以播放各种类型的媒体文件和流媒体文件,并且可以创造媒体流并保存成各种格式的媒体文件

    VLC是一种跨平台的媒体播放器和流媒体服务器,最初为videolan的客户端,它是一种非常简便的多媒体播放器,

    它可以用来播放各种各样的音视频的格式文件(MPEG-1、MPEG-2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC等等)流媒体协议

    最具特色的功能是可以边下载边观看Divx媒体文件,并可以播放不完全的AVI文件。并且支持界面的更改。

    缺点:有C/C++代码,还有Java代码,代码太庞大

  • ffmpeg框架:

    优点:轻量级框架,易于维护

    FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案

    FFMPEG几乎为你把所有的繁重工作都做了,比如解码、编码、复用和解复用。

    这使得多媒体应用程序变得容易编写。它是一个简单的,用C编写的,快速的并且能够解码几乎所有你能用到的格式,当然也包括编码多种格式。

    FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多种编码,支持AVI、MPEG、OGG、Matroska、ASF等90多种解码

    FFmpeg主目录下主要有libavcodec、libavformat和libavutil等子目录。其中libavcodec用于存放各个encode/decode模块

    libavformat用于存放muxer/demuxer模块,libavutil用于存放内存操作等辅助性模块

  • vitamio框架:

    vitamio也是基于ffmpeg开源框架

    VPlayer是vitamio的一个产品,vitamio和VPlayer是同一个团队开发的,VPlayer能播放的vitamio也能播放

Surface简介

  • Surface就是“表面”的意思。在SDK的文档中,对Surface的描述是这样的:“Handle onto a raw buffer that is being managed by the screen compositor”,

    翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原生缓冲器的句柄”, 这句话包括下面两个意思:

    • 通过Surface(因为Surface是句柄)就可以获得原生缓冲器以及其中的内容。就像在C语言中,可以通过一个文件的句柄,就可以获得文件的内容一样;
    • 原生缓冲器(rawbuffer)是用于保存当前窗口的像素数据的。
  • 简单的说Surface对应了一块屏幕缓冲区,每个Window对应一个Surface,任何View都是画在Surface上的,传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行
  • 我们不能直接操作Surface实例,要通过SurfaceHolder,在SurfaceView中可以通过getHolder()方法获取到SurfaceHolder实例。
  • Surface是一个用来画图形的地方,但是我们知道画图都是在一个Canvas对象上面进行的,*Surface中的Canvas成员,是专门用于提供画图的地方,就像黑板一样,其中的原始缓冲区是用来保存数据的地方,

    Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原始缓冲区以及其他方面的内容,所以简单的说Surface是用来管理数据的(句柄)*。

SurfaceView简介

  • 简单的说SurfaceView就是一个有SurfaceView里面内嵌了一个专门用于绘制的Surface,SurfaceView控制这个Surface的格式和尺寸以及绘制位置.SurfaceView是一个View也许不够严谨,

    然而从定义中 public class SurfaceView extends View显示SurfaceView确实是派生自View,但是SurfaceView却有着自己的Surface,源码:

    if (mWindow == null) {
        mWindow = new MyWindow(this);
        mLayout.type = mWindowType;
        mLayout.gravity = Gravity.LEFT|Gravity.TOP;
        mSession.addWithoutInputChannel(mWindow, mWindow.mSeq, mLayout,
        mVisible ? VISIBLE : GONE, mContentInsets);
    }  

    很明显,每个SurfaceView创建的时候都会创建一个MyWindownew MyWindow(this)中的this正是SurfaceView自身,因此将SurfaceViewwindow绑定在一起,而前面提到过每个window对应一个Surface

    所以SurfaceView也就内嵌了一个自己的Surface,可以认为SurfaceView是来控制Surface的位置和尺寸。传统View及其派生类的更新只能在UI线程,然而UI线程还同时处理其他交互逻辑,

    这就无法保证view更新的速度和帧率了,而SurfaceView可以用独立的线程来进行绘制,因此可以提供更高的帧率,例如游戏,摄像头取景等场景就比较适合用SurfaceView来实现。

  • Surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。
  • Surfaceview提供了一个可见区域,只有在这个可见区域内的Surface部分内容才可见,可见区域外的部分不可见,所以可以认为SurfaceView就是展示Surface中数据的地方,Surface就是管理数据的地方,

    SurfaceView就是展示数据的地方,只有通过SurfaceView才能展现Surface中的数据。

  • Surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者Surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。

    注意,如果Surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。

    这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。

    SurfaceView的核心在于提供了两个线程:UI线程和渲染线程,两个线程通过“双缓冲”机制来达到高效的界面适时更新。

SurfaceHolder简介

显示一个Surface的抽象接口,使你可以控制Surface的大小和格式以及在Surface上编辑像素,和监视Surace的改变。这个接口通常通过SurfaceView类实现。

简单的说就是我们无法直接操作Surface只能通过SurfaceHolder这个接口来获取和操作Surface

SurfaceHolder中提供了一些lockCanvas()`:获取一个Canvas对象,并锁定之。所得到的Canvas对象,其实就是Surface中一个成员。加锁的目的其实就是为了在绘制的过程中,

Surface中的数据不会被改变。lockCanvas是为了防止同一时刻多个线程对同一canvas写入。

*从设计模式的角度来看,Surface、SurfaceView、SurfaceHolder实质上就是MVC(Model-View-Controller)Model就是模型或者说是数据模型,更简单的可以理解成数据,在这里也就是Surface

View就是视图,代表用户交互界面,这里就是SurfaceView,SurfaceHolder就是Controller.*

MediaController

  • MediaController继承FrameLayout,通过MediaPlayerControl接口与VideoView进行结合控制,内部是通过PopupWindow将整个控制栏界面显示到界面上,

    而该PopupWindow所显示在的位置就是通过setAnchorView()设置进来的Anchor一般可以使当前的VideoView或者是整个Activity的根布局。这里要分为小屏和全屏两种情况来进行设置。

    如果当前的MediaController只是播放前下面的控制栏部分(进度条、快进、快退、暂停等)这样我们可以通过对VideoView设置点击事件,控制它的显示和隐藏。

    如果MediaController为整个屏幕包括了控制栏部分、上端的信息显示部分、以及左右栏的功能部分、这时候就可以通过对MediaController本身设置点击事件来控制显示和隐藏。

Controller可以用PopupWindow来实现,具体有两种方式:

- 整个控制栏(上面的信息部分、下面的控制部分以及左右边)都在`Controller`中,`setAnchorView()`的时候就会让`Controller`中的`PopupWindow`显示出来(一直显示,但是这个`PopupWindow`是透明的),
    真正的显示与隐藏是控制在`PopupWindow`中的`View`部分的显示与隐藏来实现。开始的时候我是想用这种方式,当时我想的是播放就播放、控制就控制,分离开来多好,但是没想到,
    一旦有`PopupWindow`显示出来后,Activity是接收不到任何`Touch`事件的,所有的重试界面等都要放到`Controller`中实现(手势处理等)。但是也有好处,就是不管显示还是隐藏都可以去处理手势.

- `PopupWindow`不是全屏的,只包含下面真正的控制部分(快进、快退、暂停等,不包含上面的信息部分和左右边),而且也不是开始就显示,显示隐藏是通过控制`PopupWindow`的显示与隐藏来进行的。
    而对于信息部分、以及左右边都是在`Activity`的布局当中,我们通过接口回调得到`PopupWindow`的显示与隐藏来控制这些布局的显示与隐藏即可。
    这样的话我们就需要将手势等全部放到`Activity`中去处理,但是也有一个问题,就是如果`Controller`正在显示的话`Activity`是接收不到`Touch`事件的,就无法处理手势,只能是让`Controller`消失后才能处理手势。

  • 邮箱 :[email protected]
  • Good Luck!
时间: 2024-11-05 16:31:47

视频播放相关内容总结的相关文章

移动端 h5开发相关内容总结——CSS篇

移动端 h5开发相关内容总结——CSS篇 标签: css移动 2016-01-06 15:59 5536人阅读 评论(3) 收藏 举报  分类: HTML+CSS(17)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1.移动端开发视窗口的添加 h5端开发下面这段话是必须配置的 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=n

EF Code First 配置的相关内容

I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 1 /// <summary> 2 /// 用户照片类 3 /// </summary> 4 public class PersonPhoto 5 { 6 [Key] 7 public int PersonId { get ; set ; } 8 public byte [] Photo { get ; set ; } 9 public string Caption { get ; set ; } // 标题

【转帖】MATLAB 与 音频处理 相关内容摘记

MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 1 MATLAB 音频相关函数 1 MATLAB 处理音频信号的流程 2 音量标准化 2 声道分离合并与组合 3 数字滤波 3 数据转换 5 基于MATLAB 的数字滤波实验6 MATLAB 音频相关函数 声音数据输入输出函数: 可以方便地读写au和way文件,并可控制其中的位及频率. wavread()和wavwriteO. 声音播放: wavplay():播放wav声

python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding:utf-8from com.wenhy.crawler_baidu_baike import url_manager, html_downloader, html_parser, html_outputer print "爬虫百度百科调度入口" # 创建爬虫类class SpiderMai

学习笔记之html5相关内容

写一下昨天学习的html5的相关内容,首先谈下初次接触html5的感受.以前总是听说html5是如何的强大,如何的将要改变世界.总是充满了神秘感.首先来谈一下我接触的第一个属性是  input的里面的一个属性是 type="email".以前用html的时候,type是有很多类型的,有text,password,summit.就是没听说过email.当得知这个email是验证输入的内容是否为email格式的时候.我顿时兴奋了.以前接触到html的时候,如果要验证输入内容时,是需要写js

在生成一系列相关内容后,签名文件生成

然后上传刚刚生成的CSR文件 按下Generate后,稍等一会,证书就生成了,你可以下载然后安装到本机. 3. AppID 需要强调一下的是,这里的AppID和常说的AppleID不是一个概念.AppleID是用户在苹果的账号,在AppStore上下载应用时,需要使用的就是这个账号.而AppID则是应用的身份证,用来表明应用的ID. 在证书生成后,下一步就是生成AppID,相当于帮你想开发的应用生成一张身份证. AppID需要你起一个名字以方便描述.这里不能输入特殊字符. AppID还分成带通配

App Store审核指南中文版(2014.9.10更新):新增Apple Pay相关内容

苹果在9月3日对App Store审核指南进行了重大更新,新添加了扩展.HealthKit.HomeKit以及TestFlight相关内容.另外,在9月10日新品发布会之后,苹果再次更新了App Store审核指南,添加Apple Pay相关内容.文中红色部分是相对于此前版本的新增内容,蓝色部分表示苹果相关官方文档的链接. App Store Review Guidelines(英文版). 前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个

Flume sink 相关内容

SinkRunner.java 开启线程调用相应的Processor(Policy) , 根据  Policy调用process的返回值来决定线程睡眠时间,每次默认延后1s,最大默认为5s. public class SinkRunner implements LifecycleAware { private static final Logger logger = LoggerFactory .getLogger(SinkRunner.class); private static final