嵌入式高清视频文件的硬解码播放实现

2017-03-13 05:37重庆邮电大学微电子工程重点实验室王代成朱仁义
电子世界 2017年4期
关键词:视频文件音视频队列

重庆邮电大学 微电子工程重点实验室 王代成 徐 鹏 朱仁义

嵌入式高清视频文件的硬解码播放实现

重庆邮电大学 微电子工程重点实验室 王代成 徐 鹏 朱仁义

现了H264视频和AAC音频合成的高清视频文件在Linux嵌入式平台的播放方法。采用FFmpeg解码库对文件进行格式封装解码,利用S5PV210处理器的MFC(Multi Format Codec)硬件编解码模块进行音视频解码,实现了Linux系统下的音视频同步播放,同时降低了高清视频文件播放时对CPU资源的占用率。

嵌入式;高清视频;硬解码;音视频同步

0.引言

高清视频资源的日益丰富和用户对移动高清视频播放需求的增长,使得基于嵌入式的高清视频播放终端的设计成为巨大的需求。

开源项目FFmpeg提供了一系列的多媒体视频处理工具,但其包含的音频/视频解码软件库在占用的CPU资源巨大,在低主频的嵌入式终端中并不能良好运行,所以低主频的嵌入式终端需要配合视频硬件加速解码。三星公司推出的多媒体应用处理器S5PV210采用ARM CortexTM-A8内核,内建MFC Multi Format Codec),支持MPEG-1/2/4、H.263、H.264等格式视频的编解码,非常适合应用于高清视频终端。因此本文提出了一种基于FFmpeg与S5PV210处理器的硬解码相结合的高清视频文件播放方法。

1.功能实现

1.1 整体设计

高清视频文件播放的整体方案设计如图1所示。

图1 高清视频播放的整体框图

首先将高清视频文件输入至音视频分离器,取出封装中的音视频帧并储存于缓存中,为实现同步播放,这里定义一个结构体储存帧数据和时间戳:

typedef struct av_frame {

double timeStamp;

unsigned int size;

unsigned char* data;

char frameType;

} av_frame;

其中timeStamp代表音视频帧时间戳; size代表帧长;data代表帧数据指针frameType代表视频帧类型(音频帧保留)。

以上述结构作为节点建立音视频缓存队列,分别储存音、视频帧数据。

然后音视频解码器分别从音视频队列中取出帧数据进行音视频解码,再将音视频数据根据时间戳进行音视频同步播放。

1.2 文件封装格式解码

文件封装格式解码使用FFmpeg库,FFmpeg库功能十分强大,解码步骤如下:

①初始化FFmpeg库;

②打开本地高清视频文件;

③读出媒体文件信息,并使用串口输出;

④读取码流中的音频若干帧或者视频一帧,按解码时间戳dts顺序存入缓存队列中。然后重复步骤④直至码流中所有数据帧读取完毕;

⑤最后在程序结束时关闭文件。

1.3 视频解码

视频解码使用三星公司提供的MFC硬件解码库。解码步骤如下:

①打开MFC设备,将设备的物理地址映射至虚拟地址;②使用获取设备的虚拟地址,即视频帧的输入地址;③初始化MFC设备为H264解码模式;

④从缓存队列中取出视频帧,解析视频帧按将SEI、SPS、PPS、I组合,而P帧和B帧作为独立输入,使用MFC解码函数进行解码;

⑤获取解码后的数据;

⑥重复步骤④⑤不断的进行数据解码。

1.4 音频解码

音频解码使用开源的的FAAD解码库。解码步骤如下:

①从缓存队列中取出AAC音频帧,解析AAC帧头信息,打开FAAD解码库;②使用步骤①中解析出来的帧头信息对FAAD解码库初始化;③从音频帧中取出去掉帧头的AAC数据,调用FAAD解码库函数进行解码,然后获取解码后的数据;

④不断的从缓存队列中取出新的音频帧,重复调用步骤③。

1.5 音视频同步播放

Linux声卡设备为阻塞性IO,只要用AAC帧头信息中的参数设置,音频就可以按固定速率进行播放,并阻塞输入。因此本文采用视频同步到音频的方式进行音视频同步。根据当前音视频显示时间戳pts动态调整每一帧视频画面播放的持续时间。

2.功能测试

实验采用天嵌E8开发板,该开发板采用S5PV210为处理器,内存512MB,主频1GHz,操作系统为Linux。

图3 高清视频文件信息

图4 高清视频播放效果图

整个程序编译后代码2.58MB。程序运行后,内存耗费140MB,CPU耗费14%。

程序运行后,视频解码流畅且音视频播放同步,使用调试串口输出的视频文件信息如图3所示。

由以上信息,可知视频是分辨率1920*1080的1080p高清视频。

播放效果如图4所示。

3.结束语

提出了嵌入式高清视频文件硬解码播放方法,使用功能丰富的FFmpeg开源解码库进行文件格式封装解码,同时使用S5PV210处理器进行H264硬解码,既支持了多格式的视频文件封装又降低了高清视频播放时的对处理器资源的占用率。

[1]顾艳华,王闯.基于树莓派的高清视频播放器的设计与实现[J].科技视界,2015(29):30-30.

[2]杨富豪.高清视频解码技术研究[J].数字技术与应用,2016(5): 86-86.

[3]王国裕,罗子文,张红升.基于Linux系统的DMB接收终端设计[J].数字技术与应用,2014(11):146-147.

[4]康维新.嵌入式Linux系统开发与应用[M].机械工业出版社,2011.

猜你喜欢
视频文件音视频队列
流媒体视频文件相似性识别的方法
随心定制视频文件的缩略图
队列里的小秘密
基于多队列切换的SDN拥塞控制*
3KB深圳市一禾音视频科技有限公司
在队列里
WIFI音视频信号传输的关键问题探究
丰田加速驶入自动驾驶队列
高速公路整合移动音视频系统应用
Roland专业音视频新技术研讨会在上海召开