当前位置:  编程技术>移动开发
本页文章导读:
    ▪视频播放器原理2        视频播放器原理二 播放器解决了视频播放的问题。通常来说,解决问题最好的办好就是大而化小,小而化无。因为整个播放过程是一个复杂的过程,所以播放器 也采用分而治之的办法。 简.........
    ▪ 关于中断与错误        关于中断与异常前天去面试,问到了这个问题,在回答这个问题的时候,面试官说我理解的有此问题,其实还问到了对于中断和异常的理解,现在整理一点资料出来,全当是复习吧。 1.什么.........
    ▪ Media-媒介(传媒、介质)【译】       Media-媒介(媒体、介质)【译】Media-媒介(媒体、介质) 转载请注明来源:http://blog.csdn.net/lifeshow           Android支持定制的媒介解码器,需要将定制的解码器接口暴露给框架。       .........

[1]视频播放器原理2
    来源: 互联网  发布时间: 2014-02-18
视频播放器原理二


播放器解决了视频播放的问题。通常来说,解决问题最好的办好就是大而化小,小而化无。因为整个播放过程是一个复杂的过程,所以播放器

也采用分而治之的办法。

简单来说,这个大问题可以分解为四个小问题。

1,数据接收;2,数据解析;3,数据解码;4,数据输出。

我会对mplayer和vlc这两个开源播放器的代码结构来说明这四个问题。

一,数据接收(access)

自然,我们不能无中生有,要处理数据,总要有数据来源才行。但是数据来源的渠道有很多种。

可能是硬盘文件,可能是dvd光盘,也可能是http/httplive数据包,也可能是rtp数据包(vod),或者ftp,广播电视的ts流等等。

所以第一步我们要处理的问题就是如何把不同的数据来源统一一个接口。这需要不同数据包解析器,也就是实现不同的协议来满足这个需求。

对于mplayer,相关的代码在strearm,

对于vlc,相关的代码在/modules/access

查看代码目录,里面文件名可以和我们前面说的一些数据来源一一对应。所以如果我们需要实现某种协议,大抵是可以从这里获取一些实现思

路的。

二,数据解析(demux)

有了数据了,我们还要解析这些数据。

为了方便媒体文件的传输,我们要把音频,图像,同步信息等等一堆信息放到一起(就是上一篇说的容器),这个过程就是mux(multiplex)。

但是为了方便媒体文件的处理,我们又需要解复用demux(Demultiplexer)

container是为了解决的传输而诞生的,demux就是为了解析而诞生的。

不同的容器需要不同的解析器,就是不同的demux接口,为了方便编程,我们同样需要统一接口。我们来看看mplayer和vlc是如何做的。

mplayer把相关代码放在了libmpdemux里面。

vlc把相关代码放在/modules/demux里面。

这两个代码统一各种容器的解析方式(就是我们常见的avi,ts,mkv的解析)。

不过需要注意的是,这些代码很大一部分都是warp的ffmpeg/libavformat里面的代码。

三,解码(decode)

上面那个过程把音视频数据分离,我们得到的数据可能是mpeg-2/h.264压缩的视频,也可能是mp3/aac/ac-3等音频数据。

但是这些数据都是压缩过的,我们知道,屏幕是由一个一个的点结成的,这一个一个点又是由rgb来描述的,声卡是处理一个一个音频帧的。

这个过程我们要解决的问题就是把压缩过的数据还原出来。如何还原?没错,靠我们的解码器。

上一篇说了不同的解码标准,现实中的情况是,我们有了一个标准,但是我们可能根据这个标准来实现不同的解码器。就像我们有一张桌子的

草图,但是我们做的桌子却有不同的颜色一个。标准有了,实现可以不同。

mplayer把这块代码放到libmpcodecs里

vlc把这块代码放到/modules/codec里。

不过要指出的是,这两块代码同样大部分是在warp ffmpeg/libavcodec。

ffmpeg真是做为神一样库而存在啊。

四,数据输出(render)

准备好了解码后的数据,就差最好一步输出了。

视频通常会解码为yuv数据,音频通常会解码为pcm数据。然后我们把这些数据分别放到屏幕和声卡里,播放过程就算完成了。

同样,数据输出也有很多渠道,也需要统一。

图像可能会输出到sdl,x11或者framebuffer,或者directfb,也可能是wingdi。

音频可能会出到oss,alsa,等等。

为了统一这些,vlc和mplayer同样warp了一些库,

mplayer放到libvo与libao

vlc放到/modules/audio_out与/modules/video_out。

 


    
[2] 关于中断与错误
    来源: 互联网  发布时间: 2014-02-18
关于中断与异常

前天去面试,问到了这个问题,在回答这个问题的时候,面试官说我理解的有此问题,其实还问到了对于中断和异常的理解,现在整理一点资料出来,全当是复习吧。
1.什么是异常,什么是中断?
说法一:
中断的描述主体是外设,而异常的描述主体是CPU。
中断是一个过程,是CPU在执行当前的程序的过程中因硬件或软件的原因插入了另一段程序运行的过程。
异常主要是从CPU角度,接受信号的。
中断主要是从外设角度,向CPU发送信号。
说法二:

异常是中断的一种,异常非为中断异常(IRQ/FIQ)和非中断异常(SVC/Undefine/Abort)

个人觉得,说法二应该是更专业和更好的理解,不过,面试官说应该是说法一,由于对于这两种理解,我问了一些做驱动的朋友,他们说法大多也是出自这两种,没有定论,那就两种都上,还是按个人理解,取第二种说法吧。

2.ARM异常种类及对应的处理器模式
ARM体系结构中存在7种异常处理。异常发生时,处理器会把PC指向一个特殊地址,这个地址放在存储器中一个特定表中,称为异常向量表

画个更直观的图来看一下

低地址向量表(从0x00000000开始) --裸板
高地址向量表(从0xFFFF0000开始) --带操作系统
5种异常:
中断异常:IRQ/FIQ
非中断异常:SVC/Undefine/Abort

3.异常发生时的CPU处理步骤
(1)保存当前执行位置(将当前执行位置存入到R14--LR寄存器中)
(2)保存当前执行状态(状态保存到CPSR中)
(3)寻找中断入口,即向量表地址(PC寄存器中加入东西)
(4)执行中断处理程序
(5)中断返回,继续执行

思考一下:上面这两大步究竟是在干什么?为什么要CPSR拷到SPSR,PC拷到LR_IRQ?为什么做这两步?
CPSR-->SPSR 保存要执行哪条机器码(要干什么?)
PC-->LR 保存要在哪里执行(在哪里执行?)
其实想透了非常简单,为什么要这些什么CPSR,SPSR,LR,PC搞这么一堆寄存器,目的其实只有一个----知道要在哪里干什么,SPSR中保存的是中断的的机器码,而LR_irq或LR_fiq中保存要执行的地址,这样返回的时候,就知道我要在哪个位置执行异常产生前的机器码了,仅此而已。抛开计算机这个东西,这个设计的原理其实是很简单的,不过多了几个英文缩写的名称的寄存器名字来吓人而已。

当异常产生时,ARM Core:
1)拷贝CPSR到SPSR<mode>
2)设置适当的CPSR位
3)保存返回地址到LR_<mode>
4)设置PC为相应的异常向量地址

返回时,异常处理需要:
1)从SPSR_<mode>恢复CPSR
2)从LR_<mode>恢复PC
在以前的ARMCPU,如ARM720和ARM9/10中,中断向量表的基地址只是0x00000000或是0xFFFF0000,在新的ARM11和Cotrex系列中,中断向量表可以自行设置任意的基地址。

4.FIQ和IRQ
为什么FIQ叫快速中断?
1)FIQ在中断向量表中牌向量表的最末端(最上面),基本上可以不用再跳转一次,就可以从异常地址处执行(少一层跳转指令,就少了一次流水线的重新填充周期)
2)FIQ的CPU模式拥有独立的R8--R12寄存器,其他的中断模式都必须先保存别人的,用完后再恢复,而FIQ可以使用自己的私有寄存器,当然就更快一些。
这其中有三级流水线刷新的一些问题,网上有很多的资料,喜欢研究的,可以去看《大话处理器》里面图文并茂,讲的非常清楚,面了一段时间,被问到了各种各样的问题,不断的补充与加强吧,转型不容易,选择了转型,那就坚持下去。





    
[3] Media-媒介(传媒、介质)【译】
    来源: 互联网  发布时间: 2014-02-18
Media-媒介(媒体、介质)【译】
Media-媒介(媒体、介质)
转载请注明来源:http://blog.csdn.net/lifeshow   

       Android支持定制的媒介解码器,需要将定制的解码器接口暴露给框架。
       Android针对集中常见的媒介格式,提供一套本地的解码引擎-Stagefright。Stagefright提供音频和视频播放功能,包括OpenMax解码交互、会话管理、时间同步渲染、传输控制和DRM。此外,Stagefright可以集成针对特定硬件的解码器。事实上,Android针对定制的解码器,并没有提供HAL实现,但提供了加码和解码的标准和途径。客户需要自己实现硬件解码器,把他作为OpenMax IL的附件。

            综述
       下图显示了媒介类应用与Android本地多媒体框架交互过程。

        应用框架
        应用框架包含用户APP代码,通过调用android.media API来与多媒体硬件实现交互。
        Binder IPC
        Binder IPC实现跨进程通信机制,接口位于frameworks/av/media/libmedia目录,以“I”字母打头。
        本地多媒体框架
        Android提供本地的多媒体框架,通过Stagefright引擎,实现音频和视频的摄录和回放功能。Stagefright包含默认的常见类型的软解码器,你可以通过扩展OpenMax IL层接口来定制自己的硬件解码器。要了解更多信息,可以参看各类型媒体播放器源码,同时可参考Stagefright组件目录( frameworks/av/media)。
        OpenMAX Integration Layer (IL)
        OpenMax IL为Stagefright提供一套标准的用于识别和使用特定多媒体解码组件的方式。针对自定义解码器,你必须提供一个叫 libstagefrighthw.so的共享插件库。改链接库,将定制的解码器链接到Stagefright。定制的解码器必须符合OpenMax IL组件标准。
        解码器定制
        Stagefright内置一套标准的软解码器,也可以针对特定要求定制自己的硬件解码器。需要创建一个OMX组件,并将组件以Hook方式链接到解码器和Stagefright框架。例如,针对Galaxy Nexus机型,你可以参考hardware/ti/omap4xxx/domx/和hardware/ti/omap4xx/libstagefrighthw的组件及插件实现。
        要定制解码器分一下几步:
        1)依据OpenMax IL标准,创建解码组件,该组件接口定义位于frameworks/native/include/media/OpenMAX/OMX_Component.h头文件。
        2)创建一个OMX插件,用于链接到Stagefright服务。插件接口定义位于frameworks/native/include/media/hardware目录的OMXPluginBase.h和HardwareAPI.h头文件中。
        3)将插件编译成共享链接库,命名为libstagefrighthw.so。如:LOCAL_MODULE := libstagefrighthw
        4)将插件链接库加入设备makefile中。PRODUCT_PACKAGES += \
  libstagefrighthw \
  ...
        5)将解码器暴露给框架。Stagefright服务首先解析system/etc/media_codecs.xml和system/etc/media_profiles.xml 文件,来确定支持的解码格式,暴露的接口可以通过
android.media.MediaCodecList和android.media.CamcorderProfile类调用。 需要在device/<company_name>/<device_name>/目录创建上面的两个xml,同时复制到system/etc目录。如:
PRODUCT_COPY_FILES += \
  device/samsung/tuna/media_profiles.xml:system/etc/media_profiles.xml \
  device/samsung/tuna/media_codecs.xml:system/etc/media_codecs.xml \
可以参看device/samsung/tuna/media_codecs.xml和device/samsung/tuna/media_profiles.xm具体实现。
注:
自Jelly Bean开始,Android不再支持<Quirk>元素标签。
       

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
java开源软件 iis7站长之家
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3