[SimplePlayer] 2. 在屏幕上显示视频图像

我们这里采用SDL(本文所用版本为SDL2.0.5)来进行图像输出,SDL在进行图像渲染时一般采用的会是direct3D或者opengl,SDL对它们进行了封装,不过我们这里只讨论SDL的使用,并不会去涉及这些底层实现。尽管如此,我们还是有必要了解其中一些基本概念,这些概念能帮助我们很好地理解所使用的SDL api的实际作用。

其中最重要的一个概念就是render,中文译为渲染,rendering在计算机图像领域指的就是图像合成(image synthesis)。通俗一点的解释就是:render指的是把2D图像(图形)或者3D模型变成所展示出来的图像的过程,实际进行这种转换操作的物件被称为renderer(渲染器)。在SDL中,renderer主要处理的是2D的数据,其中包括

  1. 图形:画点、画线、画面、笔触上色、填充颜色等。
  2. 图像:裁剪、旋转等。

不过本文只用到renderer最基本的功能,即把图像输出到窗口。在SDL中,为了方便renderer的实现,renderer所处理的对象被规定为texture(纹理),因此图像需要先被包装成texture,texture会被render成rendered image,然后就可以输出到window。

image

 

 

初始化

在使用SDL的函数之前,需要先调用SDL_Init来进行初始化,由于本文的目的是进行视频图像输出,因此需要指定flag为SDL_INIT_VIDEO来初始化视频子系统。

    if(SDL_Init(SDL_INIT_VIDEO)){fprintf(stderr, "SDL init video failed\n");return -1;}

 

接下来创建window、renderer、texture。在创建texture时需要指定输入的图像像素格式,通常视频的像素格式都是yuv420p,对应的flag为SDL_PIXELFORMAT_IYUV。对于会频繁更换的视频图像,还需要指定texture为SDL_TEXTUREACCESS_STREAMING。

    window = SDL_CreateWindow("Simple Player", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, DEF_WIDTH, DEF_HEIGHT, 0);if(!window){fprintf(stderr, "SDL create window failed\n");return -1;}renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);if(!renderer){fprintf(stderr, "SDL create renderer failed\n");return -1;}texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, DEF_WIDTH, DEF_HEIGHT);if(!renderer){fprintf(stderr, "SDL create renderer failed\n");return -1;}SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_NONE);SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);SDL_RenderClear(renderer);

 

创建用于存储图像像素数据的缓冲区,并打开yuv文件,以供后续读取图像

    YPlane = (unsigned char *)malloc(DEF_WIDTH*DEF_HEIGHT);UPlane = (unsigned char *)malloc(DEF_WIDTH*DEF_HEIGHT/4);VPlane = (unsigned char *)malloc(DEF_WIDTH*DEF_HEIGHT/4);pFile = fopen(argv[1], "rb");if(pFile==NULL)return -1;

 

 

显示

循环读取图像进入缓冲区,然后把图像传入texture进行包装、渲染、最后输出,每帧间隔为1/24秒。对于视频子系统来说,还有一个必不可少的步骤,就是在循环中调用SDL_PumpEvents。SDL_PumpEvents如其名称,主要的功能是推动event队列以进行队列状态的更新,不过它还有一个作用是进行视频子系统的设备状态更新,如果不调用这个函数,所显示的视频会在大约10秒后丢失色彩。

    while(1){sizeY = fread(YPlane, 1, DEF_WIDTH*DEF_HEIGHT, pFile);sizeU = fread(UPlane, 1, DEF_WIDTH*DEF_HEIGHT/4, pFile);sizeV = fread(VPlane, 1, DEF_WIDTH*DEF_HEIGHT/4, pFile);if(!sizeY||!sizeU||!sizeV)break;if(0!=SDL_UpdateYUVTexture(texture, NULL, YPlane, DEF_WIDTH, UPlane, DEF_WIDTH/2, VPlane, DEF_WIDTH/2)){fprintf(stdout, "Render Update Texture failed, reason: %s\n", SDL_GetError());}SDL_RenderCopyEx(renderer, texture, NULL, NULL, 0, NULL, 0);SDL_RenderPresent(renderer);SDL_Delay(1000/FRAMERATE);SDL_PumpEvents();}

 

 

退出

退出前的收尾处理

    SDL_DestroyTexture(texture);SDL_DestroyRenderer(renderer);SDL_DestroyWindow(window);free(YPlane);free(UPlane);free(VPlane);fclose(pFile);

转载于:https://www.cnblogs.com/TaigaCon/p/9622016.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实例27:python

#题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 #函数赋值两个变量 def output(s,l): if l0: return print (s[l-1]) output(s,l-1) s input(‘Input a string:’) l len(s) output(s,l)

《React Native跨平台移动应用开发》PDF电子书分享

链接: https://pan.baidu.com/s/14r6xZPJ0u1mrZejEuV8RrA 密码: pqan 分享《React Native跨平台移动应用开发》PDF电子书,本书为高清PDF电子书,内容截图如下 转载于:https://www.cnblogs.com/meidongdiluo/p/9625607.html

实例28:python

#题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 #问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。 #问第2个人,说比第一个人大两岁。最后问第一个人,他说是1…

如何使用vs2017进行html开发,VS2017开发vue单页应用

我正在学vue开发,想用VS开发一个单页应用,按照网上的提示配置好了,但是始终无法运行起来,主要有以下两点:在main.js中使用了import Vue from vue,但是实际运行时提示 import 错误无法安装npm包,…

实例29:python

#题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字 #!/usr/bin/python -- coding: UTF-8 -- x int(input(“请输入一个数:\n”)) a x / 10000 b x % 10000 / 1000 c x % 1000 / 100 d x % 100…

2021届定远三中高考成绩查询,定远各中学高考喜报!

原标题:定远各中学高考喜报!关注定远2019年高考实现多项新突破本科达线人数较上年增加340人(点击看大图)砥砺前行新时代,定远教育写华章。6月23日,全县人民高度关注的2019年高考成绩揭晓。我县教体系统广大师生不负众望&#xff0…

实例30:python

#一个5位数,判断它是不是回文数。即12321是回文数, #个位与万位相同,十位与千位相同。 x int(input(‘输入一个五位数:’)) a int(x / 10000) b int(x % 10000 / 1000) c int(x % 1000 / 100) d int(x % 100 / 10) e int(x …

实例31:python

#题目:请输入星期几的第一个字母来判断一下是星期几 #!/usr/bin/python -- coding: UTF-8 -- letter input(“please input:”) #while letter ! ‘Y’: if letter ‘S’: print (‘please input second letter:’) letter input(“please input:”) if lette…

实例32:python

#按相反的顺序输出列表的值。 #!/usr/bin/python -- coding: UTF-8 -- a [‘one’, ‘two’, ‘three’] for i in a[::-1]: print (i)

整样运用计算机考试,2017年9月计算机二级考试《MS Office高级应用》上机操作题(2)...

字处理题12012级企业管理专业的林楚楠同学选修了“供应链管理”课程,并撰写了题目为“供应链中的库存管理研究”的课程论文。论文的排版和参考文献还需要进一步修改,根据以下要求,帮助林楚楠对论文进行完善。(1)在考生文件夹下,将…

Django缓存和内置信号

缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中,当用户再次请求时,直接去缓存中拿,避免对数据库的频繁操作,加快数据的显示时间,需要知道的是,缓存里面的数据一般都设置有超时…

实例33:python

#题目:按逗号分隔列表。 #!/usr/bin/python -- coding: UTF-8 -- L [1,2,3,4,5] s1 ‘,’.join(str(n) for n in L) print (s1)

你的第一个Django程序

本文使用Pycharm、Django 2.0.9、Python 3.6环境,本文大纲 建立Django项目建立页面什么是URLconf和ROOT_URLCONFDjango怎么处理URL请求关于URL尾部的“/” 反斜线1. 建立一个Django项目 Application name如果填写会自动帮你建立一个APP,而且APP是必须的&…

分割法和填补法_“聚合”法与“分割”法

一门新的思维与实践的科学“聚合”法是宗脉学中“宗脉”关系的根本原则,这是一门新的思维与实践的科学,它的研究角度和方法都不同于任何以往唯物主义与唯心主义学派。“宗”即是整体,本质,聚和,“脉”是本质的分支与脉…

[USACO 2017 Feb Gold] Tutorial

Link: 传送门 A: 分层图最短路&#xff08;其实就是最短路转移时多记录一维的数据 #include <bits/stdc.h>using namespace std; #define X first #define Y second typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN105; int n,…

实例34:python

#练习函数调用。 #!/usr/bin/python -- coding: UTF-8 -- def hello_world(): print (‘hello world’) def three_hellos(): for i in range(3): hello_world() if name ‘main’: three_hellos() #1&#xff1a;__name__是一个变量。前后加了下划线是因为是因为这是系统…

计算机进去pe怎么设置用户,电脑密码怎么设置,教您设置电脑开机密码

为了保障电脑重要资料的安全&#xff0c;不被其他同事看到&#xff0c;我们都会给自己的电脑设置开机密码&#xff0c;有了开机密码就可以让别人不能直接使用我们的电脑了&#xff0c;那么电脑开机密码如何设置呢&#xff1f;下面小编给您耐心讲解下电脑开机密码设置方法。说到…

实例35:python

#文本颜色设置 #!/usr/bin/env python -- coding:utf-8 -- Python设置文本文字颜色 class bcolors: HEADER ‘\033[95m’ # pink OKBLUE ‘\033[94m’ # blue OKGREEN ‘\033[92m’ # green WARNING ‘\033[93m’ # yellow FAIL ‘\033[91m’ # red ENDC ‘\033[0m’…

哈佛大学计算机科学专,哈佛大学计算机科学专业

哈佛大学计算机科学专业通过哈佛文理研究生院申请并统一管理&#xff0c;要求申请者递交GRE成绩&#xff0c;但并无最低GRE分数要求。该项目设有BA/MS、PhD两个项目。所有PhD学生均可以获得全额奖学金&#xff0c;但不向硕士学生发放奖学金。哈佛大学计算机科学专业设置计算机架…

excel亮灯怎么设置_Excel表格技巧—怎么给表格设置密码

很多 Excel 表格里都有一些重要信息&#xff0c;但是当我们给别人发Excel表格时&#xff0c;别人可能会不小心或者故意更改表中数据。怎么才能避免这些表格的数据被更改呢&#xff1f;小编在这里和大家分享一个技巧&#xff1a;给表格设置密码&#xff01;如下图&#xff0c;假…