美文网首页
使用SDL播放一张YUV图片

使用SDL播放一张YUV图片

作者: Moneys | 来源:发表于2018-12-06 17:32 被阅读0次

代码

sdl2_demo.c

#include <stdio.h>
#include <SDL2/SDL.h>

// 显示窗口大小
int WINDOW_W = 640;
int WINDOW_H = 480;

int thread_exit = 0;

int refresh_video(void *opaque)
{
    while(thread_exit == 0)
    {
        SDL_Event event;
        event.type = SDL_USEREVENT + 1;
        SDL_PushEvent(&event);
        SDL_Delay(40);
    }
    printf("exit refresh video thread.\n");
    return 0;
}

int main()
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window *window = SDL_CreateWindow("SDL Demo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_W, WINDOW_H, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);

    SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, 0);

    SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, WINDOW_W, WINDOW_H);

    FILE *fp = fopen("test.iyuv", "rb");
    if (!fp)
    {
        printf("Cannot open the file.\n");
        return -1;
    }

    // 图片的宽高
    const int IMG_W = 640;
    const int IMG_H = 480;

    uint8_t buff[IMG_W * IMG_H * 3 / 2];
    fread(buff, 1, IMG_W * IMG_H * 3 / 2, fp);
    fclose(fp);

    SDL_Thread *thread = SDL_CreateThread(refresh_video, NULL, NULL);

    SDL_Event event;
    SDL_Rect rect;

    while (1)
    {
        SDL_WaitEvent(&event);
        if (event.type == SDL_USEREVENT + 1)
        {
            SDL_UpdateTexture(texture, NULL, buff, IMG_W);

            rect.x = 0;
            rect.y = 0;
            rect.w = WINDOW_W;
            rect.h = WINDOW_H;

            SDL_RenderClear(renderer);
            SDL_RenderCopy(renderer, texture, NULL, &rect);
            SDL_RenderPresent(renderer);

            SDL_Delay(40);
        }
        else if(event.type == SDL_WINDOWEVENT)
        {
            SDL_GetWindowSize(window, &WINDOW_W, &WINDOW_H);
            printf("window resize, w=%d h=%d\n", WINDOW_W, WINDOW_H);
        }
        else if(event.type == SDL_QUIT)
        {
            printf("Exit.\n");
            break;
        }
    }

    return 0;
}

编译

新建编译脚本,如build.sh

内容如下,SDL2的安装目录$PREFIX根据实际情况修改

#!/bin/bash
PREFIX=/usr/local
gcc sdl_demo.c -o sdl_demo -I $PREFIX/include -L $PREFIX/lib -lSDL2

执行脚本即可编译。

上述代码下载

参考

相关文章

  • 使用SDL播放一张YUV图片

    代码 sdl2_demo.c 编译 新建编译脚本,如build.sh 内容如下,SDL2的安装目录$PREFIX根...

  • 23_FFmpeg像素格式转换

    简介 前面使用 SDL 显示了一张YUV图片以及YUV视频。接下来使用Qt中的QImage来实现一个简单的 YUV...

  • 结合ffmpeg用SDL播放YUV实现简易播放器

    通过解码之后得到的yuv视频数据我们直接可以进行播放,本篇使用SDL来实现视频播放。 SDL环境配置:https:...

  • 22_播放器之使用SDL显示YUV视频

    简介 使用SDL实现简单的YUV播放器。这里还需要使用到像素格式和计算图片大小,这两个我们直接使用ffmpeg来实...

  • 音视频-像素格式转换

    在音视频-SDL播放YUV(下)[/p/1a067860639b]成功播放yuv裸流数据之后, 下载的是对应格式的...

  • SDL显示YUV

    SDL显示YUV步骤 初始化SDL子系统 SDL_Init(SDL_INIT_VIDEO) 创建窗口 SDL_Cr...

  • 音视频-SDL播放YUV(下)

    在 音视频-SDL播放YUV(上)[https://www.jianshu.com/p/1f4844cc6c65]...

  • SDL彻底理解纹理渲染

    SDL渲染基本原理 SDL纹理相关API 1、SDL_CreateTexture() format:YUV,RGB...

  • 使用SDL显示YUV

    SDL 显示 YUV 流程: 1、初始化 Video 子系统;2、创建窗口;3、创建渲染上下文;4、创建纹理;5、...

  • SDL实现YUV播放器

    用SDL来实现YUV播放器主要是通过一个播放时间管理线程,每隔一段时间(比如1秒播放25帧那就每隔40毫秒)发送一...

网友评论

      本文标题:使用SDL播放一张YUV图片

      本文链接:https://www.haomeiwen.com/subject/xsoocqtx.html