ffmpeg和SDL的多媒体编程(二) 输出到屏幕

SDL和视频

为了在屏幕上显示,我们将使用SDL.SDL是Simple Direct Layer的缩写。它是一个出色的多媒体库,适用于多平台,并且被用在许多工程中。你可以从它的官方网站的网址 http://www.libsdl.org/上来得到这个库的源代码或者如果有可能的话你可以直接下载开发包到你的操作系统中。按照这个指导,你将需要 编译这个库。(剩下的几个指导中也是一样)

SDL库中有许多种方式来在屏幕上绘制图形,而且它有一个特殊的方式来在屏幕上显示图像――这种方式叫做YUV覆盖。YUV(从技术上来讲并不叫YUV而 是叫做YCbCr)是一种类似于RGB方式的存储原始图像的格式。粗略的讲,Y是亮度分量,U和V是色度分量。(这种格式比RGB复杂的多,因为很多的颜 色信息被丢弃了,而且你可以每2个Y有1个U和1个V)。SDL的YUV覆盖使用一组原始的YUV数据并且在屏幕上显示出他们。它可以允许4种不同的 YUV格式,但是其中的YV12是最快的一种。还有一个叫做YUV420P的YUV格式,它和YV12是一样的,除了U和V分量的位置被调换了以外。 420意味着它以4:2:0的比例进行了二次抽样,基本上就意味着1个颜色分量对应着4个亮度分量。所以它的色度信息只有原来的1/4。这是一种节省带宽 的好方式,因为人眼感觉不到这种变化。在名称中的P表示这种格式是平面的――简单的说就是Y,U和V分量分别在不同的数组中。FFMPEG可以把图像格式 转换为YUV420P,但是现在很多视频流的格式已经是YUV420P的了或者可以被很容易的转换成YUV420P格式。

于是,我们现在计划把指导1中的SaveFrame()函数替换掉,让它直接输出我们的帧到屏幕上去。但一开始我们必需要先看一下如何使用SDL库。首先我们必需先包含SDL库的头文件并且初始化它。

#include <SDL.h>

#include <SDL_thread.h>

if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))

{

         fprintf(stderr, "Could not initialize SDL - %s/n", SDL_GetError());

        exit(1);

}

SDL_Init()函数告诉了SDL库,哪些特性我们将要用到。当然SDL_GetError()是一个用来手工除错的函数。

创建一个显示

现在我们需要在屏幕上的一个地方放上一些东西。在SDL中显示图像的基本区域叫做面surface。

SDL_Surface *screen;

screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);

if(!screen)

{

         fprintf(stderr, "SDL: could not set video mode - exiting/n");

         exit(1);

}

这就创建了一个给定高度和宽度的屏幕。下一个选项是屏幕的颜色深度――0表示使用和当前一样的深度。(这个在OS X系统上不能正常工作,原因请看源代码)

现在我们在屏幕上来创建一个YUV覆盖以便于我们输入视频上去:

SDL_Overlay *bmp;

bmp = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height,SDL_YV12_OVERLAY, screen);

正如前面我们所说的,我们使用YV12来显示图像。

时间: 2024-08-31 15:20:19

ffmpeg和SDL的多媒体编程(二) 输出到屏幕的相关文章

ffmpeg和SDL的多媒体编程(一) 制作屏幕录像

电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置.AVI和Quicktime就是容器的例子.接着,你有一组流,例如,你经常有的是一个音频流和一个视频流.(一个流只是一种想像出来的词语,用来表示一连串的通过时间来串连的数据元素).在流中的数据元素被称为帧Frame. 每个流是由不同的编码器来编码生成的.编解码器描述了实际的数据是如何被编码Coded和解码DECoded的,因此它的名字叫做CODEC.Divx和 MP3就是编解码器的例

c语言编程,输出最高分和最低分,为什么出错了···

问题描述 c语言编程,输出最高分和最低分,为什么出错了··· #include void main() { float maxscore,minscore,minnum,maxnum; int i,n; printf("请输入8位同学的学号num:n"); scanf("%d",&n); printf("输入8名同学的英语成绩score:n"); for(i=0;i scanf("%d",&num[i],&am

关于在android下用ffmpeg和sdl开发播放器的问题

问题描述 关于在android下用ffmpeg和sdl开发播放器的问题 从网上找了个ffmpeg和SDL开发的全格式播放器,但是发现每次播放完毕就会kill掉APP,好像是由于exit(0)执行的结果. 请问有没有人研究过这一块儿,如何只退出当前的activity,回到列表页面,而且下次进来还可以继续播放? 如果把C代码中解码和播放的部分写成线程有用吗? 解决方案 播放过程有没有先放在 Service 中?就像音乐播放器的实现一样. 解决方案二: 没有放在service中,但是放在一个线程中.我

RGB和YUV 多媒体编程基础详细介绍_基础知识

RGB和YUV 多媒体编程 一.概念 1.什么是RGB? 对一种颜色进行编码的方法统称为"颜色空间"或"色域".用最简单的话说,世界上任何一种颜色的"颜色空间"都可定义成一个固定的数字或变量.RGB(红.绿.蓝)只是众多颜色空间的一种.采用这种编码方法,每种颜色都可用三个变量来表示-红色绿色以及蓝色的强度.记录及显示彩色图像时,RGB是最常见的一种方案. 2.什么是YUV? YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和

求助:急需一份《Visual C++.NET多媒体编程》的源码

问题描述 本人急需一份<VisualC++.NET多媒体编程>的源码?能帮帮忙么,在网上苦熬两天了,找不到,想买书得到那光盘,可现在书也没处买,实在需要,兄弟帮个忙吧!大恩不言谢.白客同志介绍过来地.我在技术交流1群.qq:30363882camerabuff@yahoo.cncsdn昵称:qbdpqbdp先谢了,在线等. 解决方案 解决方案二:不明LZ在说什么解决方案三:都是很好的建议!值得学习

我的媒体播放器——多媒体编程

第二个题目是我的播放器,可以播放音频和视频.其实略懂计算机多媒体技术的人都清楚,音频和视频的差异具体是体现在文件格式上的.不同的音频mp3,midi,wav等其实是不同的编码或者格式,同理不同的视频avi,rm(rmvb),mov等其实也是不同的编码格式,这些格式中,大多数都是不公开源代码的,但是公开标准或者API接口.但编程调用依然很繁琐,我们也没有精力和能力去研究这些. .Net本身不带多媒体库,但是具有与COM交互的强大能力.恰好,微软DirectShow技术能满足上述要求,而且可以跟.N

python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错

问题描述 python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错 python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错 解决方案 这个就是ctypes没找到,你尝试把环境变量什么的好好配置一下

Qt开发中如何添加第三方库--(以ffmpeg和sdl库为例)

 近期做一个播放器的项目,界面采用qt开发,需要用到第三方库ffmpeg和sdl库.由于以前没有qt添加第三方库的经验,因此在环境配置上费了不少功夫,因此在这里总结一下   在QT中,自动化编译过程,是通过qmake工具生成一个makefile文件实现的,它是由.pro文件生成而来的,因此添加第三方库可以从.pro工程文件入手. 添加第三方库,我们主要添加两个信息,一个是头文件信息,参数是INCLUDE,还有一个是链接库信息,参数在pro文件参数中是LIBS 同样由于我们所采用的编译器的不同,第

gpu c语言-cuda gpu 编程 二维线程块

问题描述 cuda gpu 编程 二维线程块 这个程序语言用到二维线程块么 什么时候需要? 解决方案 GPU-cuda编程葵花宝典CUDA下的GPU编程--线程和变量CUDA下的GPU编程--线程和变量