首页 > 其他分享 >SDL播放YUV数据

SDL播放YUV数据

时间:2023-11-14 16:44:30浏览次数:36  
标签:include int YUV SDL 播放 pixel

一、概述

  上一节使用SDL2在窗口上显示了一张图片,本节使用SDL2播放YUV420P数据。

  YUV420P一帧数据的长度=width*height*3/2

二、代码示例

  下面这段示例代码读取YUV数据和现实YUV数据都是在同一个线程中的。播放是能播放,但是会很卡,不一会儿就会出现无响应的情况。下一节使用多线程进行改造

#include "include/sdl_read_yuv.h"
#include <iostream>
using namespace std;

SDLReadYuv::SDLReadYuv() {

    const int bpp = 12;
    int window_w = 640, window_h = 360;
    const int pixel_w = 640, pixel_h = 360;
    unsigned char buffer[pixel_w * pixel_h * bpp / 8];

    if (SDL_Init(SDL_INIT_VIDEO)) {
        cout << "初始化SDL失败" << SDL_GetError() << endl;
        return;
    }

    SDL_Window* window;
    window = SDL_CreateWindow("Simplest Video Play SDL2",
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        window_w,
        window_h,
        SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);

    if (!window) {
        cout << "SDL: could not create window" << SDL_GetError() << endl;
        return;
    }

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

    Uint32 pixFormat = 0;
    pixFormat = SDL_PIXELFORMAT_IYUV;

    SDL_Texture* texture = SDL_CreateTexture(renderer, pixFormat, SDL_TEXTUREACCESS_STREAMING, pixel_w, pixel_h);

    FILE* fp = NULL;
    fp = fopen("E:/tony/demo/visualstudio_workspace/SDLDemo/out/build/x64-debug/SDLDemo/yuv/sintel_640_360.yuv", "rb+");
    if (fp == NULL) {
        cout << "cannot open this file" << endl;
        return;
    }

    //这个区域会存放显示的视频
    SDL_Rect sdlRect;

    while (true) {
        //这里是读取一帧视频真,数据格式是YUV420P,像素排列是4:2:0,一行像素=width*height+width*1/4+height*1/4 = width*height*3/2
        //所以下面这句话刚好就是读取了一个视频帧YUV的数据长度
        if (fread(buffer, 1, pixel_w * pixel_h * bpp / 8, fp) != pixel_w * pixel_h * bpp / 8) {
            // Loop
            fseek(fp, 0, SEEK_SET);
            fread(buffer, 1, pixel_w * pixel_h * bpp / 8, fp);
        }

        SDL_UpdateTexture(texture, NULL, buffer, pixel_w);

        sdlRect.x = 0;
        sdlRect.y = 0;
        sdlRect.w = window_w;
        sdlRect.h = window_h;//把视频就显示到这个区域

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

        SDL_Delay(40);

    }

    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);

    SDL_Quit();

}

 

标签:include,int,YUV,SDL,播放,pixel
From: https://www.cnblogs.com/tony-yang-flutter/p/17831972.html

相关文章

  • SDL事件之简单退出事件SDL_QUIT
    一、概述上一篇使用SDL加载了一张图片,图片展示后3秒窗口会自动关闭,如果不想让窗口自动关闭,而是用户自己指定啥时候关闭就啥时候关闭,该怎么弄?那就有必要加上SDL的事件了。加入一个简单的SDL事件非常简单。以点击X号关闭窗口为例:1.初始化SDL事件//初始化......
  • SDL2加载一个图片
    一、概述使用SDL2+SDL2_Image显示一张图片操作步骤:SDL2的操作流程:1.初始化SDLSDL_Init2.创建SDL_WindowSDL_CreateWindow3.创建渲染器SDL_RendererSDL_CreateRenderer4.生成一个SDL_Surface,这个Surfac......
  • 从DPlayer说起,有哪些开源的H5播放器
    引言​ H5指的是HTML5,也就是介绍网页播放器(只是列出而已)。首先我不是什么大佬,并没有完全体验过以下我会介绍的全部播放器;其次,因为我水平比较低,主要介绍拥有中文文档的播放器,不了解开发的朋友当成科普看看就行,平常用不到,了解的可以补充一下还有哪些,毕竟我收集的肯定不全,最好能补......
  • SDL2 无法解析的外部符号 main,函数 "int __cdecl invoke_main(void)" (?invoke_main@@
    一、概述在使用VisualStudio+CMake集成SDL2的过程中。运行一个Demo示例出现了以下错误提示无法解析的外部符号main,函数"int__cdeclinvoke_main(void)"(?invoke_main@@YAHXZ) 二、解决办法上面问题的主要原因是程序找不到入口函数因为SDL中自己也定义了......
  • Unity播放Hap格式视频 (大分辨下流畅播放以及帧同步解决方案)
    前言:之前对于项目上播放大分辨率视频(特别是大于4k分辨率的)常常会感觉相当的头疼,最开始使用的是Unity自带的VideoPlayer,发现效果并不理想,更换为AVPro后发现播放是流畅了但不能操作视频快进,只要一快进就会出现卡顿,最后偶然间发现了一款用于播放Hap格式视......
  • 安防视频监控平台EasyCVR设备录像回看新增播放倍速
    EasyCVR平台具有融合性强、开放度高和部署轻快的特点。它支持对海量视频进行汇聚和管理,并且与第三方系统实现无缝集成。平台可以处理和分发接入的流媒体视频,支持多种视频格式,如RTSP、RTMP、FLV、HLS和WebRTC等。在视频功能方面,平台提供监控直播、录像、检索与回看、存储、级联和告......
  • 视频监控EasyCVR平台播放告警录像时,播放器显示不全是什么原因?
    防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力......
  • 视频监控系统EasyCVR平台播放告警录像时,播放器显示不全是什么原因?
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的......
  • Windows10+VSCode+cmake+opencv+ffmpeg+sdl2环境配置
    一、概述在Windows10上配置一个C++开发环境:工具:VSCode编译器:Mingw64(使用gcc进行编译)构建工具:CMake第三方库:集成OpenCV、FFmpeg、SDL2二、操作步骤1.安装mingw64并配置bin目录到环境变量2.下载VSCode并安装3.安装CMake并......
  • 怎么通过LiveNVR流媒体平台配置实现将海康Ehome、ISUP协议统一接入实现Web无插件播放
    @目录1、海康ISUP接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例3、通道配置3.1、直播流接入类型海康ISUP3.2、海康ISUP设备ID3.3、启用保存3.4、接入成功4、相关问题4.1、其它方式接入4.2、如何输出GB281815、RTSP/HLS/FLV/RTMP拉流Onvif流媒......