一个简单的使用SDL播放YUV文件的示例

【FFmpeg】SDL 音视频开发 ⑥ ( SDL 播放 YUV 视频 | YUV 4:2:0 采样 | YUV420P 格式介绍 | 获取 YUV 视频文件 | 读取并加载 YUV 画面数据 ) 一、SDL 播放 YUV 视频 1、YUV 4:2:0 采样 2、YUV420P 格式介绍 3、获取 YUV 视频文件 4、读取 YUV 画面数据 5、加载 YUV 视频数据 二、完整代码示例 1、代码示例 2、执行效果 阅读详情

SDL(Simple DirectMedia Layer)是个好东西!

要想开发一个自己的跨平台的媒体播放器(如ffplay等),它就大有武之地啦。

SDL的入门介绍有很多,比如中文的有“龙飞”的洋洋洒洒一个系列:

http://www.cppblog.com/lf426/archive/2008/01/30/42161.aspx

当然,官方的教程是很有用:

http://lazyfoo.net/SDL_tutorials/index.php

官方的教程讲了SDL的各个方面,但是并没有讲播放器的具体设计。而ffmpeg的

教程(http://dranger.com/ffmpeg/tutorial01.html)夹杂着一堆的ffmpeg专用的代码,

搞得想单看的人很混乱,所以我结合了这两个教程,写了一个很简单的示例程序。


#include"SDL-1.2.14\include\SDL.h"
#include <string>
#include <stdlib.h>

/* The pre-defined attributes of the screen */
// CIF
const int SCREEN_WIDTH  = 352;
const int SCREEN_HEIGHT = 288;
const int SCREEN_BPP    = 8;

typedef struct yuv_pic
{
  char* pv_data[4];
  int   v_linesize[4]; //number of bytes per line
} s_picture;



int main( int argc, char* args[])
{
  FILE* pf_yuv;
  SDL_Surface* ps_screen;
  SDL_Overlay* ps_bmp;
  SDL_Rect     s_rect;

  char*        pv_frame = NULL;
  int          v_pic_size = 0, v_frame_size = 0;
  s_picture    s_yuv_pic;

  /* Init SDL */
  if( SDL_Init(SDL_INIT_EVERYTHING) == -1)
  {
    fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
    exit(1);
  }

  /* Set up the screen */
  ps_screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, SDL_SWSURFACE);
  if( !ps_screen )
  {
    fprintf(stderr, "SDL: could not set video mode -exiting\n");
    exit(1);
  }

  /* Set the window caption */
  SDL_WM_SetCaption( "YUV Window", NULL);

  /* Create a YUV overlay */
  ps_bmp = SDL_CreateYUVOverlay(SCREEN_WIDTH, SCREEN_HEIGHT, SDL_YV12_OVERLAY,
    ps_screen);

  /* Open the YUV file */
  if( (pf_yuv = fopen("coastguard_cif.yuv", "r")) == NULL )
  {
    fprintf(stderr, "SYS: could not open file %s\n", "akiyo_cif.yuv");
    exit(2);
  }

  v_frame_size = (SCREEN_WIDTH * SCREEN_HEIGHT);
  v_pic_size   = ((v_frame_size * 3) / 2);
  if( (pv_frame = (char*)calloc(v_pic_size, 1)) == NULL )
  {
    fprintf(stderr, "SYS: could not allocate mem space\n");
    exit(2);
  }

  s_yuv_pic.pv_data[0] = pv_frame;  //Y
  s_yuv_pic.pv_data[1] = (char*)(pv_frame + v_frame_size);
  s_yuv_pic.pv_data[2] = (char*)(pv_frame + v_frame_size + v_frame_size/4);
  s_yuv_pic.v_linesize[0] = SCREEN_WIDTH;
  s_yuv_pic.v_linesize[1] = (SCREEN_WIDTH/2);
  s_yuv_pic.v_linesize[2] = (SCREEN_WIDTH/2);

  /* Apply the image to the screen */
  ps_bmp->pixels[0] = (unsigned char*)(s_yuv_pic.pv_data[0]);
  ps_bmp->pixels[2] = (unsigned char*)(s_yuv_pic.pv_data[1]);
  ps_bmp->pixels[1] = (unsigned char*)(s_yuv_pic.pv_data[2]);

  ps_bmp->pitches[0] = s_yuv_pic.v_linesize[0];
  ps_bmp->pitches[2] = s_yuv_pic.v_linesize[1];
  ps_bmp->pitches[1] = s_yuv_pic.v_linesize[2];

  /* Update the screen */
  s_rect.x = 0;
  s_rect.y = 0;
  s_rect.w = SCREEN_WIDTH+8;
  s_rect.h = SCREEN_HEIGHT+8;

  /* Load YUV frames */
  int i = 0, ret=0;
  while( !(ret = fread(pv_frame, v_pic_size, 1, pf_yuv)) )
  {
    i++;
    fprintf(stderr, "%dth frame's ret = %d\n", i, ret);

    fseek(pf_yuv, v_pic_size*i, SEEK_SET);
   
    SDL_LockYUVOverlay(ps_bmp);

    SDL_DisplayYUVOverlay(ps_bmp, &s_rect);

    SDL_UnlockYUVOverlay(ps_bmp);
 
    SDL_Delay( 40 );
  }


  /* Free the surfaces */
  fclose(pf_yuv);
  free(pv_frame);

  /* Quit SDL */
  SDL_Quit();

  return 0;
}





最简单的用SDL播放yuv视频 最简单的用SDL播放yuv视频,简单的学习视频的播放。进一步的还需研究。 立即下载

相关推荐

SDL的使用示例_显示YUV数据

博文http://blog.csdn.net/i_scream_/article/details/52714378 中的代码以及相关资料。

SDL实现YUV播放器

用SDL来实现YUV播放器主要是通过一个播放时间管理线程,每隔一段时间(比如1秒播放25帧那就每隔40毫秒)发送一个刷新事件,启动事件监听后,每次监听到刷新事件后就从YUV文件中读取一帧图片在SDT创建的窗口中进行纹理渲染展示。 /*YUC播放器*/ #include <stdio.h> #include <string.h> #include <SDL.h> #define BLOCK_SIZE 4096000 //event message #define R

heng615975867的专栏 759

基于SDL2播放yuv视频

基于SDL2播放YUV视频,在vs2010上测试通过,是博文《基于SDL2播放YUV视频》中的代码,详细解释见:https://blog.csdn.net/u011003120/article/details/81985929

最简单的视音频播放示例7:SDL2播放RGB/YUV

本文记录SDL播放视频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D这类的API用于播放视频;封装了DirectSound这类的API用于播放音频。因为SDL的编写目的就是简化视音频播放的开发难度,所以使用SDL播放视频(YUV/RGB)和音频(PCM)数据非常的容易。

雷霄骅(leixiaohua1020)的专栏 3万+

yuv文件播放器(支持yuvr的所有格式)

小巧的YUV文件播放器,可以播放所有格式的YUV文件,并且可以选择播放格式。具有简单播放器的所有功能。

Win11家庭版如何让Win+R运行CMD默认管理员权限?3种方法实测有效

本文针对Win11家庭版用户,实测了三种让Win+R运行CMD默认获取管理员权限的有效方法。通过分析UAC机制与家庭版功能限制,详细介绍了注册表编辑、快捷方式创建与任务计划程序三种方案的原理、步骤与风险对比,帮助用户根据安全与效率需求选择最佳方案,实现一键高效管理。

sat99的博客 1274

SDL2播放yuv视频文件与事件(event)

1.整体代码 先上代码: #include <stdio.h> #include <string.h> #include <SDL.h> //自定义消息类型 #define REFRESH_EVENT (SDL_USEREVENT + 1) // 请求画面刷新事件 #define QUIT_EVENT (SDL_USEREVENT + 2) // 退出事件 //定义分辨率 // YUV像素分辨率 #define YUV_WIDTH

师范大学生的博客 727

视频教程-Ps教程之神奇的Photoshop自动化技术-Photoshop

Ps教程之神奇的Photoshop自动化技术 10年以上IT行业工作经验、三...

weixin_28812857的博客 1475

SDL 2播放YUV视频文件

【代码】SDL 2播放YUV视频文件。

melonbo的专栏 576

游戏安全逆向实战:如何用010Editor绕过ACE反作弊的文件校验(附详细步骤)

本文详细介绍了如何通过逆向工程思维和010Editor工具,针对PC游戏中ACE反作弊系统的文件校验机制进行分析与绕过。文章以实战案例为核心,逐步拆解了定位校验逻辑、解析校验数据文件、计算并替换哈希值的关键步骤,为安全研究人员提供了一种在用户态(Ring 3)层面进行轻量化对抗的思路与方法。

iii12的专栏 732

PCB工艺-SI9000-模型选择

本文介绍了PCB设计中常用的阻抗计算模型,主要包括外层、内层和嵌入式三类共12种计算模型,涵盖单端/差分、共面等不同场景。针对阻抗计算中的关键参数,文章提供了经验值参考:表层走线厚度0.035mm(1.4mil),内层0.0152mm(0.6mil);并列出常见PP材料的介电常数(3.8-4.5)和成品厚度(3-7.5mil)。作者建议90%的设计问题可通过上述模型解决,层叠参数建议咨询PCB厂家获取。

weixin_50120208的博客 1385

Qt+SDL播放YUV视频文件

播放一个yuv420p格式的文件 yuv的格式与rgb格式的存储方式不同 yuv数据是 yyyyyyyy uu vv 的存储 rgb是rgba rgba rgba 存储 同样一帧图像 yuv420会比rgb数据更小 读取时就要注意数据存储格式不同,数据大小也不同 直接上代码 sdl_qt_play_yuv.h #include <QtWidgets/QWidget> #include <SDL2/SDL.h> #include <fstream> #include "

qq_40684669的博客 727

ABAP Secure Storage 在事务码 SM59 中的应用

系统管理人员在进行维护时,应关注相关日志信息,及时发现可能出现的安全异常,并针对不同安全等级的操作制定相应的备份与恢复策略,以降低潜在风险。该区域在设计上具备高度隔离性,仅允许经过授权的组件访问。保存后,系统会将密码存储在 Secure Storage 中,这种处理方式充分体现了 SAP 标准程序在安全设计上的考量。对于系统管理员而言,这种机制在日常维护与审计中提供了有力的支持,可以通过比对存储数据的哈希值或其他完整性校验手段,及时发现异常变动,保障系统长期稳定运行。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 675

【音视频连载-006】基础学习篇-SDL 播放 YUV 视频文件

公众号回复:OpenGL,领取学习资源大礼包音视频学习入门技术文章连载:技术开发故事会连载【音视频连载-001】基础学习篇-SDL 介绍以及工程配置【音...

音视频开发进阶 343

HBase在物流行业的应用:轨迹数据存储

想象一下,每天在全球范围内,数以亿计的物流包裹在各个城市、乡镇间穿梭。每一个包裹从发货人手中出发,经过仓储中心、转运站,最终到达收货人手中,这一路上都留下了它的“足迹”,也就是我们所说的轨迹数据。这些数据就像一个个拼图碎片,完整拼接起来后,能够清晰地呈现出整个物流网络的运行状况。例如,你在网上购买了一件心仪已久的商品,迫不及待地想知道它现在到哪儿了。物流平台实时更新的轨迹信息,让你可以准确了解包裹是在运输途中,还是已经到达附近的站点。

架构师的AI之路,分享AI应用开发架构的学习与实践。 965

【JDK】win 10 / win 11:jdk 8 下载、安装、配置、验证

win10 / win 11:JDK 最新版本下载 / 历史版本下载(jdk 8)、安装、配置系统环境变量、验证安装全详细操作教程

顾三殇 —— 博客空间(软件测试) 13万+

SDL播放YUV文件

#include &lt;stdio.h&gt; extern "C" { #include "SDL.h"; #include "SDL_thread.h"; }; #pragma warning(disable : 4996) int screen_w = 500, screen_h = 500; const int pixel_w = 352, pixel_h = 288; ...

Lifelong Learning Pan 476

PTC Creo软件二次开发:使用C++进行Creo二次开发实战

C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。由Bjarne Stroustrup在贝尔实验室开发,最初作为C语言的增强版出现,后来发展成为一种独立的语言。C++不仅保留了C语言的高效性和灵活性,还引入了类、模板、命名空间等高级特性,使其成为开发复杂系统和软件的理想选择。

kkchenjj的博客 4043

SDL学习四:使用SDL编写一个播放器播放YUV格式的视频文件

1.视频播放的大致流程如下: 初始化—>创建窗口—>创建渲染器—>创建纹理—>读取一帧数据—>设置纹理数据—->将纹理数据拷贝给渲染器—>显示—>退出 https://blog.csdn.net/u011003120/article/details/81985929?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159564179519724835820583%2522%252C%2522scm

qq_44194231的博客 488

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

使用SDL_QT直接播放渲染YUV格式文件

IYUV 是 YUV420 格式的一种变体,其中 Y 分量在内存中是连续存储的,而 U 和 V 分量是交错存储的。因此,一个 IYUV 像素点的大小与 YUV420 相同。在 IYUV 中,一个像素的大小通常为:Y 分量:8 位(1 字节)U 分量:8 位/4 = 2 位(0.25 字节)V 分量:8 位/4 = 2 位(0.25 字节)

m0_51386664的博客 1516

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SDL播放YUV视频文件

在视频解码的过程中,不再使用延时40ms的方式,而是创建了 一个线程,每隔40ms发送一个自定义的消息,告知主函数进行解码显示。

mytzs123的博客 136

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

FFmpeg把MP4文件解码为YUV,然后通过SDL播放

#include &amp;lt;iostream&amp;gt; extern &quot;C&quot; { #include &amp;lt;libavcodec/avcodec.h&amp;gt; #include &amp;lt;libavformat/avformat.h&amp;gt; #include &amp;lt;libswscale/swscale.h&amp;gt; #include &amp;l

墨雨依旧付疏狂Q 19万+

FFmpeg 4.3 H265六,使用SDLVSQT显示yuv文件,使用SDL_UpdateYUVTexture 和 SDL_UpdateTexture都实现一遍

每次读取YUV文件的一部分,然后显示。

hunandede的博客 673

播放yuv420的程序-用到SDL

<br />2010.12.13 by Pafone<br />用到SDL-1.2.14<br />环境:VC2008 + winXP + SDL-1.2.14<br />可以在 http://trace.eas.asu.edu/yuv/index.html 这里下yuv文件, <br />另外VC工程文件与SDL的VC开发包 我上传到了http://download.csdn.net/user/pafone<br /> <br />用法:play_yuv420.exe yuvfilename width

pafone的专栏 3485
上一篇: FFmpeg情景分析 1. FFmpeg转码框架解析
下一篇: 《微软:DirectShow编程》第一章 DirectShow的基本概念
北雨南萍
北雨南萍 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄20年 2665粉丝 453原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北雨南萍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值