SMedia视频播放解析:重点解析


本篇针对上面两篇文章的内容未涉及到的内容进行详细说明,主要针对视频的组成,播放原理和视频播放过程控制进行说明。其中包含有针对第一篇的留下的内容进行补充说明。

视频的组成 — 视频与容器

人们设定了不同的视频文件格式来把视频和音频放在一个文件中,以方便同时回放,实际上都是一个容器里面包裹着不同的轨道。容器是用来区分不同文件的数据类型的,而编码格式则由音频、视频的压缩算法决定,我们一般所说的文件格式或者是后缀名指的就是文件的容器。

对于一种容器,可以包含不同编码格式的一种视频和音频。多媒体封装格式也称多媒体容器 (Multimedia Container),它不同于DivX、 MP3这类编码格式,它只是为多媒体编码提供了一个“外壳”。

常见格式(容器):

  • AVI(*.AVI) : 比较早的AVI是Microsoft开发的。其含义是Audio Video Interactive,就是把视频和音频编码混合在一起存储。AVI也是最长寿的格式,已存在10余年了,虽然发布过改版(V2.0于1996年发布),但已显老态。AVI格式上限制比较多,只能有一个视频轨道和一个音频轨道(现在有非标准插件可加入最多两个音频轨道),还可以有一些附加轨道,如文字等。AVI格式不提供任何控制功能。
  • MPG (*.mpg/*.mpeg/*.dat) : MPEG编码采用的音频视频容器,具有流的特性。里面又分为 PS,TS 等,PS 主要用于 DVD 存储,TS 主要用于 HDTV。
  • MP4(* .MP4) : MPEG-4编码采用的音频视频容器,基于 QuickTime MOV 开发,具有许多先进特性。
  • MOV (*.mov/*.QT): 是由苹果公司开发的容器。1998年2月11日,国际标准组织(ISO)认可QuickTime文件格式作为MPEG-4标准的基础。QT可存储的内容相当丰富,除了视频、音频以外还可支持图片、文字(文本字幕)等。
  • RM (*.rm/*.rmvb): RealMedia 采用的音频视频容器,用于流传送。 由RealNetworks开发的一种容器,它通常只能容纳Real Video和Real Audio编码的媒体。可变比特率的RMVB格式,体积很小,非常受到网络下载者的欢迎。
  • MKV(Matroska Video File): 视频档,可以包含音频和字幕;Matroska最大的特点就是能容纳多种不同类型的视频编码、音频编码及字幕流,并且它能把非常高密的RealMedia及QuickTime文件也容纳在内,同时将它们的音频和视频重新组织起来,从而达到一个更好和鲜明的效果。

音视频编码:

上面是一些常用的文件格式,也就是容器,它们又分别对应了不同的编码格式,下面是常用的视频和音频编码格式:

序号 标准 标准名称 备注
1 MPEG标准 MPEG-1 | MPEG-2 | (MPEG-3) | MPEG-4 | MPEG-7 | MPEG-21
2 ITU-T标准 H.261 | (H.262) | H.263 | H.263v2 | H.264
3 Real Video Real Networks

音频格式:音频编码格式较多,这里不详细描述。

视频播放的原理

大致来说视频的播放分为以下几个部分,也可以说是步骤:

  • acess 访问,或者理解为接收、获取、得到
  • demux 解复用,就是把通常合在一起的音频和视频分离(还有可能的字幕)
  • decode解码,包括音频和视频的解码
  • output 输出,也分为音频和视频的输出(aout和vout)

注:demux分解出来的音频和视频流分别送往音频解码器和视频解码器。

首先我们看sxaMpsOpen( )这个函数的实现,其中有以下的代码:


这里会用四个Open的动作,包括:Media Sample,Demuxer,Audio Decode,Video Decode,它们作用见下表:

序号 项目 作用 备注
1 Media Sample 分配资源给其他项目。
2 Demuxer 创建解复用线程,对文件进行分离。
3 Audio Decode 创建音频解码线程,对音频进行解码。
4 Video Decode 创建视频解码线程,对视频进行解码。

注:ARanderer 是用来调试的,这里不做说明。

然后创建3个线程如下所示:


那么现在流程就比较清晰了,就是通过三个线程的同步作用,进行分解和音视频的解码动作。然后我们再看看源码的文件组成:src/sxa文件夹目录下,可以看到 dmx 和mps两个文件夹,分别对应的是:解文件的代码,音视频解码及其他的代码。

其文件组成和详细的支持的文件格式,音视频编码格式如下所示:




dmx目录下的文件和code中可以看出,支持的文件格式有:3GP ,avi,MPEG1,MP4;支持的视频编码格式及音频编码格式就要从code里面看到,如上我们可以知道我们可以支持的编码类型和文件类型,也方便后期与客户的交流实际的功能的实现。

SXA_HANDLE_T的结构

播放的API,主要是通过一个SXA_HANDLE_T 的指针来传递一个特殊的结构用来管理播放的状态,因此首先我们要弄清楚这一结构具体的实现,看看sxaMpsOpen( )这个函数的实现就可以知道了:SXA_HANDLE_T 的实现其实就是SXA_MPSSHELLCTX_T,它的结构如下:

看似简单的一个结构体,除开调试用的两个元素外,一个int 型nFlags基本没有什么作为,int型的nState用来指示播放的状态,剩下的内容全部在SXA_MPSGLOBALCTX_T 这一结构体当中,再看下这一个结构体:

设置状态

Video播放的API的状态除了用上述的API进行控制外,其他输入输出都是依靠函数sxaMpsGetProp() 和 sxaMpsSetProp(),其具体的申明如下:

都是相同的参数的函数,通过hMps指定句柄,通过eProp 参数指定输入/输出类型,通过pvProp 输入/输出具体的值,具体类型如下:

针对不同的类型,可能还是有很多不同的结构体在封装数据,具体就可以参考:sxaMpsSetProp的实现,在定义不同的细节。

写在最后

至此,所有关于SMedia的笔记视频部分就全部说明完毕,这是5年前的总结,包含了对视频的浅显认识,现在过了这么多年也没有再去涉及到具体流程的控制部分真实惭愧。

历史上的今天:

  1. 2018:  Linux 终端输入和输出详解(2)

发表评论

电子邮件地址不会被公开。 必填项已用*标注