摘要:SDL是一套开源跨平台多媒体开发库,使用 C 语言写成。,提供了数种控制 图像、声音、输出 入的函数。YUV分别表示:Y(亮度),U(蓝色投影)和V(红色投影),一般用UV表示色度。一般视频解码出来后是一帧一帧的YUV数据(因为大部分编解码算法都是基于YUV而不是RGB),而屏幕显示图像需要的是RGB数据,从YUV到RGB的转换就是视频渲染过程。
1、SDL视频播放流程
1.1 常用函数
SDL_Init ():初始化 SDL 系统
SDL_CreateWindow ():创建窗口 SDL_Window
SDL_CreateRenderer ():创建渲染器 SDL_Renderer
SDL_CreateTexture ():创建纹理 SDL_Texture
SDL_UpdateTexture ():设置纹理的数据
SDL_RenderCopy ():将纹理的数据拷贝给渲染器
SDL_RenderPresent ():开始渲染并显示
SDL_WaitEvent():阻塞等待事件到来
SDL_Delay ():工具函数,用于延时
SDL_Quit ():退出 SDL 系统
1.2 渲染流程
初始化: 初始化SDL库;创建一个Windows窗口;创建纹理(Texture)和渲染器(Render);给缓冲区分配内存空间;打开YUV视频文件;创建线程并指定线程处理函数。
线程处理函数: 定时(此处是40ms,即每秒25帧)发送一次刷新事件。
渲染: 循环调用SDL_WaitEvent()等待接收事件。
如果是刷新事件,则从YUV文件里读取一帧数据,然后调用SDL_UpdateTexture()将这一帧数据更新到纹理上,再调用SDL_RenderClear()清除当前显示的画面,然后调用SDL_RenderCopy()将纹理拷贝给渲染器,最后调用SDL_RenderPresent()更新当前显示画面。
如果是窗口事件,则根据窗口大小更新视频显示的宽和高。
如果是退出事件,则结束渲染,并通知事件处理线程退出。
2、示例代码
以下代码已再QT4.14.0上运行OK,功能时播放一个YUV420p的视频,首先需要在运行目录下放置一个yuv420p_320x240.yuv文件(可以用ffmpeg工具生成),然后运行此代码。
#include <stdio.h>
#include <string.h>
#include <SDL.h>
//自定义消息类型
#define USR_REFRESH_EVENT (SDL_USEREVENT + 1) // 请求画面刷新事件
#define USR_QUIT_EVENT (SDL_USEREVENT + 2) // 退出事件
int g_thread_exit_flag = 1; // 线程退出标志 = 1则退出
int refresh_video_timer(void *data) //定时发送刷新事件给主线程处理
{
SDL_Event event;
while (g_thread_exit_flag)
{
event.type = USR_REFRESH_EVENT;
SDL_PushEvent(&event); // 发送刷新事件
SDL_Delay(40); // 40ms刷新一次,即每秒25帧
}
event.type = USR_QUIT_EVENT; // 退出信号
SDL_PushEvent(&event); // 发送退出信号,通知main函数退出
return 0;
}
#undef main // SDL里有main函数,防止重复定义编译报错
int main()
{
SDL_Event event;

本文详细介绍了SDL库在视频播放中的应用,包括初始化、窗口创建、纹理和渲染器管理,以及YUV到RGB的转换过程。通过示例代码展示了如何实现实时YUV视频的渲染和事件处理。
最低0.47元/天 解锁文章
958

被折叠的 条评论
为什么被折叠?



