SylixOS中视频播放的实现

1. 相关名词解释

1.1      什么是YUV编码

YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度,也就是灰阶值;而“U”和“V”表示的则是色度,作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

1.2      什么是YUV420格式

YUV420 格式即YUV 4:2:0格式。4:2:0并不意味着只有Y、Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2*2个2行2列相邻的像素组成的宏像素需要占用6字节内存。

2. 视频播放的实现

2.1      读取YUV420格式帧

本文使用的YUV420格式视频分辨率为:x86架构下SylixOS系统的默认的分辨率640*480,每秒的帧数为25帧。

所以视频的每一帧宽度为640,高度为480,共640*480个像素点。在YUV420格式中,一个像素点对应一个Y,一个2*2的小方块对应一个U和V。可以准确的计算出一帧YUV420图像大小为:

Y+U+V

其中:

Y = 640(width) * 480(height);

U = Y / 4;

V = Y / 4;

则一帧图像的总大小为:width * height * 3/2 ,单位是字节。

读入函数如程序清单2.1所示:

程序清单2.1 读入一帧YUV图像

#define nWidth     (640)                     /*  帧宽度                    */

#define nHeight    (480)                     /*  帧高度                    */

#define FrameSize  (nWidth*nHeight*3/2)      /*  帧大小                    */

fread(pBuf, 1, FrameSize, fp);               /*  读入一帧YUV               */

2.2      显示一帧画面

要将每一帧画面显示到屏幕上,需要打开系统的framebuffer设备,将framebuffer物理内存映射到用户空间,并在对应区域写入颜色值,对应的颜色会自动在屏幕上显示。只要将一帧所有的像素点颜色写入对应区域,完整的一帧画面就会在屏幕上显示。

源视频帧数为每秒25帧,即每一帧间隔时间为0.04秒,为了保证播放的流畅度,加入定时器控制显示帧间隔。

显示一帧的代码实现如程序清单2.2 所示:

程序清单2.2 显示一帧YUV图像

#define FrameInterval   (40000)              /*  每帧间隔时间,单位微秒       */

gettimeofday(&start,NULL);

for (j = 0; j< nHeight;j++) {

for (i = 0;i < nWidth;i++) {

Color = pointXY[j][i][iPlayFrame];

draw_pixel(pframebuffer, &scr_info, &var_info, i, j, Color);

}

}                                            /*  整个循环为一帧画面的输出     */

do {

gettimeofday(&end,NULL);

time_use=(end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);

}while(time_use <= FrameInterval);           /*  控制帧间隔时间              */

2.3      将YUV420格式帧转换为RGB888格式帧

SylixOS系统提供接口所接受的颜色信息格式为RGB格式,形如”#FF0000”为红色的颜色值。

需要将读入的YUV420信息转码为RGB信息,RGB与YUV的变换公式如图2.3所示:

图2.3  RGB与YUV变换公式

RGB 也可以直接从YUV (256级别) 计算:

R = Y + 1.402 (Cr-128)

G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)

B = Y + 1.772 (Cb-128)

但是直接计算涉及浮点运算,影响转码效率,所以利用空间换时间思路,以查找表来替代转换过程中的一些计算。

查表法转换的实现函数如程序清单2.4所示,由于表数据较多,所以未列出具体的表信息。

程序清单2.4 转码一帧YUV图像

for (int i = 0;i < height;i++){

for (int j = 0;j < width;j++){

yIdx = i * width + j;

vIdx = (i/2) * (width/2) + (j/2);

uIdx = vIdx;

rdif = Table_fv1[vData[vIdx]];

invgdif = Table_fu1[uData[uIdx]] + Table_fv2[vData[vIdx]];

bdif = Table_fu2[uData[uIdx]];

bgr[0] = yData[yIdx] + bdif;       //B

bgr[1] = yData[yIdx] - invgdif;    //G

bgr[2] = yData[yIdx] + rdif;       //R

for (int e = 0;e < 3; e++)

{

if(bgr[e] < 0 || bgr[e] > 255)

bgr[e] = (bgr[e] < 0)?0:255;

}

pointXY[i][j][iReadFrame] = rgbColor(bgr[0], bgr[1], bgr[2]);

for (int k = 0;k < 3;k++){

idx = (i * width + j) * 3 + k;

pBGR24[idx] = bgr[k];

}

}

}

iReadFrame++;

3. 总结

在SylixOS中我们可以利用系统提供的framebuffer设备接口,读入文件,转码,写入内存,从而实现图像、视频的播放。

在转码过程中,需要考虑转码效率,采取更加节约时间的方式转换。同时要考虑系统的性能,适当减少帧数以达到视频更加流畅的目的。

原文地址:http://blog.51cto.com/13549832/2054493

时间: 2024-10-08 19:49:39

SylixOS中视频播放的实现的相关文章

SylixOS中pthread_cancel函数浅析

1 知识简介 1.1 概述 取消一个线程要确保该线程能够释放其所持有的任何锁.分配的内存,使整个系统保持一致性.在很多复杂情况下要保证这种正确性是有一定困难的. 一种简单的线程取消:取消线程调用一个取消线程的函数,被取消线程死亡.在这种情况下,被取消线程所持有的的资源得不到释放.取消线程负责保证被取消者处于可安全取消状态,在一个要求可靠性高的系统中,这种保证非常困难或者无法实现.这种取消称为不受限制的异步取消. 还存在另外一种更安全的线程取消机制.一个线程可以以可靠的受控制的方式向进程的其他线程

SylixOS中RTC设备驱动

1.概述 本文档基于SylixOS-EVB-i.MX6Q验证平台,介绍SylixOS中RTC设备驱动实现过程,可作为在SylixOS集成开发环境下进行字符设备驱动开发的参考. 2.RTC设备驱动 2.1硬件原理 实时时钟(RTC)的主要功能是在系统掉电的情况下,利用备用电源使时钟继续运行,保证不会丢失时间信息. i.MX6Q验证平台上使用的是外置实时时钟集成电路ISL1208.硬件接线如图 2.1所示. 图 2.1 RTC硬件接线 图中,X1和X2为内部反向放大器的输入和输出引脚,要求外置一个3

SylixOS中DNS静态映射简介

1. DNS功能简介 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,用户能够通过域名访问互联网,而不用去记住IP地址.通过域名得到其对应的IP地址的过程叫做域名解析.每个域名都对应一个IP地址,但一个IP地址可以对应多个域名. 2. SylixOS中DNS静态映射 主机名到IP地址的映射有两种方式: 1) 静态映射,每台设备上都配置主机到IP地址的映射,各设备独立维护自己的映射表,而且只供本设备使用: 2) 动态映射,建立一套域名

SylixOS中SD驱动实现流程

1.概述 本文档以imx6实验平台为例,介绍SD设备驱动实现流程. 2.SylixOS中SD系统框架 SylixOS中SD协议栈(以下称作SD Stack)结构如图 2.1所示. 图 2.1 SD 协议栈结构 1)Host层:硬件控制器抽象层,SD控制器在不同的硬件平台上可能有不同的实现,因此需要实现具体的传输处理操作.所有的控制器驱动都向上(Core层)提供统一的操作接口.SD Stack已经提供了符合SD规范的标准控制器SDHCI驱动,在此情况下,控制器驱动的编写将更加简单.当然也可使用SP

SylixOS中CPU性能计算

1.概述 本篇主要介绍SylixOS中CPU性能计算方法. 2.简介 BogoMips是SylixOS中衡量CPU运行速度的一种标准,但只能用来粗略计算CPU的性能,并不十分精确. SylixOS中关于CPU性能计算的方法位于内核文件"libsylixos/SylixOS/kernel/interface/CpuPerf.c"中. 3.接口及具体实现 SylixOS内核中定义了用于计算CPU运算速度的相关接口. 3.1 接口介绍 #include <SylixOS.h> U

SylixOS中端模式处理方式总结

1. 端模式简介 端模式(Endian)表示数据在存储器中的存放顺序.大端模式(Big-endian),将数据的低位保存在高地址中,而数据的高位,保存在低地址中.小端模式(Little-endian),将数据的低位保存在内存的低地址中,而数据的高位保存在高地址中. 1.1      端模式对数据字节序的影响 对于内存数据字节序,大端模式高字节(MSB)存放在低地址,低字节(LSB)存放在高地址:小端模式低字节(LSB)存放在低地址,高字节(MSB)存放在高地址.如果将一个32位的整数0x1234

SylixOS中PPC架构系列介绍-Cache篇

1. Cache简介 Cache:高速缓冲存储器,是位于CPU和主存储器DRAM(DynamicRandomAccessMemory)之间,规模较小,但速度很高的存储器,通常由SRAM(StaticRandomAccessMemory静态存储器)组成.它是位于CPU与内存间的一种容量较小但速度很高的存储器. 2. SylixOS中Cache架构 SylixOS中为了对Cache进行有效的管理,提供了API层的系统接口,隐藏硬件架构之间的差异.在不同的CPU架构下,又各自封装了Arch层的Cach

SylixOS中ROOTFS介绍

ROOTFS简介ROOTFS(根文件系统)是一种特殊的文件系统,根文件系统是内核启动时挂载的第一个文件系统,因此根文件系统包括了SylixOS启动时所必须的目录和关键性的文件,例如内核启动时所必需的etc目录,以及系统命令bin目录等,任何包括这些SylixOS启动所必须的文件都可以成为根文件系统.SylixOS的ROOTFS属于虚拟类型的根文件系统,因为此文件系统并不存在于具体的物理磁盘中,而是系统启动后动态创建的,并将此系统保存于内存中. 根目录文件系统映射配置参数系统内核启动参数函数API

html5中视频播放问题总结

html5中视频播放问题总结 文章 1.问题一 框架? 加个标签就OK! <video id="video1" src="/video1.mp4" controls="controls"></video> 2.问题2 控制? 简单! <video id="video1" src="/video1.mp4" autoplay></video> 其他控制方式 :见