06-流媒体-YUV数据在SDL控件显示
整体方案:
采集端:摄像头采集(YUV)->编码(YUV转H264)->写封装(H264转FLV)->RTMP推流
客户端:RTMP拉流->解封装(FLV转H264)->解码(H264转YUV)->YUV显示(SDL2)
YUV视频是通过SDL控件显示,首先要编译SDL库。
SDL2库源码:https://download.csdn.net/download/sishen4199/88547680
$ ./configure --prefix=/home/zg/zg_code/zg_test/video_ref/SDL/SDL2-2.28.5/build_lib
make
make install
#include <stdio.h>extern "C"
{
#include "SDL2/SDL.h"
};const int bpp=12;int screen_w=640,screen_h=360;
const int pixel_w=640,pixel_h=360;unsigned char buffer[pixel_w*pixel_h*bpp/8];//Refresh Event
#define REFRESH_EVENT (SDL_USEREVENT + 1)#define BREAK_EVENT (SDL_USEREVENT + 2)int thread_exit=0;int refresh_video(void *opaque){thread_exit=0;while (!thread_exit) {SDL_Event event;event.type = REFRESH_EVENT;SDL_PushEvent(&event);SDL_Delay(40);}thread_exit=0;//BreakSDL_Event event;event.type = BREAK_EVENT;SDL_PushEvent(&event);return 0;
}int main(int argc, char* argv[])
{if(SDL_Init(SDL_INIT_VIDEO)) { printf( "Could not initialize SDL - %s\n", SDL_GetError()); return -1;} SDL_Window *screen; //SDL 2.0 Support for multiple windowsscreen = SDL_CreateWindow("Simplest Video Play SDL2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,screen_w, screen_h,SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);if(!screen) { printf("SDL: could not create window - exiting:%s\n",SDL_GetError()); return -1;}SDL_Renderer* sdlRenderer = SDL_CreateRenderer(screen, -1, 0); Uint32 pixformat=0;//IYUV: Y + U + V (3 planes)//YV12: Y + V + U (3 planes)pixformat= SDL_PIXELFORMAT_IYUV; SDL_Texture* sdlTexture = SDL_CreateTexture(sdlRenderer,pixformat, SDL_TEXTUREACCESS_STREAMING,pixel_w,pixel_h);FILE *fp=NULL;fp=fopen("sintel_640_360.yuv","rb+");if(fp==NULL){printf("cannot open this file\n");return -1;}SDL_Rect sdlRect; SDL_Thread *refresh_thread = SDL_CreateThread(refresh_video,NULL,NULL);SDL_Event event;while(1){//WaitSDL_WaitEvent(&event);if(event.type==REFRESH_EVENT){if (fread(buffer, 1, pixel_w*pixel_h*bpp/8, fp) != pixel_w*pixel_h*bpp/8){// Loopfseek(fp, 0, SEEK_SET);fread(buffer, 1, pixel_w*pixel_h*bpp/8, fp);}SDL_UpdateTexture( sdlTexture, NULL, buffer, pixel_w); //FIX: If window is resizesdlRect.x = 0; sdlRect.y = 0; sdlRect.w = screen_w; sdlRect.h = screen_h; SDL_RenderClear( sdlRenderer ); SDL_RenderCopy( sdlRenderer, sdlTexture, NULL, &sdlRect); SDL_RenderPresent( sdlRenderer ); }else if(event.type==SDL_WINDOWEVENT){//If ResizeSDL_GetWindowSize(screen,&screen_w,&screen_h);}else if(event.type==SDL_QUIT){thread_exit=1;}else if(event.type==BREAK_EVENT){break;}}SDL_Quit();return 0;
}
PRJ_PATH = .
TARGETS = video_prj
DIR_INC = ./inc
DIR_SRC = ./src
DIR_OBJ = ./obj
CXX = g++SRC := $(wildcard ${DIR_SRC}/*.cpp)
OBJ := $(patsubst ${DIR_SRC}/%.cpp,$(DIR_OBJ)/%.o,$(SRC))FFMPEG_LIB_DIR = $(PRJ_PATH)/third_lib/ffmpeg/lib
FFMPEG_INC_DIR = $(PRJ_PATH)/third_lib/ffmpeg/includeSDL_LIB_DIR = $(PRJ_PATH)/third_lib/SDL/lib
SDL_INC_DIR = $(PRJ_PATH)/third_lib/SDL/includeINCLUDES = -I$(DIR_INC)
INCLUDES += -I$(FFMPEG_INC_DIR)
INCLUDES += -I$(SDL_INC_DIR)LDFLAGS = -ldl -lpthread -lm
LDFLAGS += -lX11 -lasound -lmp3lame -lz -lrt
LDFLAGS += -L$(FFMPEG_LIB_DIR) -lavformat -lavdevice -lavcodec -lavutil -lavfilter -lpostproc -lswresample -lswscale
LDFLAGS += -L$(SDL_LIB_DIR) -lSDL2CXXFLAGS = -fpermissive
CXXFLAGS += -fPIC CFLAGS += $(INCLUDES)$(TARGETS):$(OBJ)$(CXX) $^ -o $@ $(LDFLAGS) $(CXXFLAGS)$(DIR_OBJ)/%.o:$(DIR_SRC)/%.cpp$(CXX) $(CFLAGS) -c $< -o $@ $(CXXFLAGS)
clean:rm -f $(TARGETS)rm -f $(DIR_OBJ)/*.o
完整工程:https://download.csdn.net/download/sishen4199/88547724
相关文章:
06-流媒体-YUV数据在SDL控件显示
整体方案: 采集端:摄像头采集(YUV)->编码(YUV转H264)->写封装(H264转FLV)->RTMP推流 客户端:RTMP拉流->解封装(FLV转H264)…...
对象和数据结构
文章目录 前言一、从链式调用说起二、数据抽象三、数据、对象的反对称性四、得墨忒尔律五、数据传送对象总结 前言 代码整洁之道读书随笔,第六章 一、从链式调用说起 面向对象语言中常用的一种调用形式,链式调用,是一种较受推崇的编码风格&…...
ESP32-BLE基础知识
一、存储模式 两种存储模式: 大端存储:低地址存高字节,如将0x1234存成[0x12,0x34]。小端存储:低地址存低字节,如将0x1234存成[0x34,0x12]。 一般来说,我们看到的一些字符串形式的数字都是大端存储形式&a…...
vscode终端npm install报错
报错如下: npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion1, but package-lock.json was generated for lockfileVersion2. Ill try to do my best with it! npm ERR! code EPERM npm ERR! syscall open npm ERR! errno -4048…...
雪花算法的使用
雪花算法的使用(工具类utils) import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;// 雪花算法 Component public class SnowflakeUtils { // Generated ID: 1724603634882318341; // Generated ID: 1724603…...
flink源码分析之功能组件(一)-metrics
简介 本系列是flink源码分析的第二个系列,上一个《flink源码分析之集群与资源》分析集群与资源,本系列分析功能组件,kubeclient,rpc,心跳,高可用,slotpool,rest,metric,future。其中kubeclient上一个系列介绍过,本系列不在介绍。 本文介绍flink metrics组件,metric…...
Nginx反向代理和负载均衡
1.反向代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一…...
基于SSM的供电公司安全生产考试系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
大数据-之LibrA数据库系统告警处理(ALM-12055 证书文件即将过期)
告警解释 系统每天二十三点检查一次当前系统中的证书文件,如果当前时间距离过期时间不足告警阈值天数,则证书文件即将过期,产生该告警。告警阈值天数的配置请参考《管理员指南》的“配置证书即将过期告警阈值”章节。 当重新导入一个正常证…...
应试教育导致学生迷信标准答案惯性导致思维僵化-移动机器人
移动机器人课程群实践创新的困境与突围 一、引言 随着科技的快速发展,工程教育变得越来越重要。然而,传统的应试教育模式往往侧重于理论知识的传授,忽视了学生的实践能力和创新精神的培养。这在移动机器人课程群的教学中表现得尤为明显。本文…...
【运维篇】5.4 Redis 并发延迟检测
文章目录 0.前言Redis工作原理可能引起并发延迟的常见操作和命令并发延迟检测分析和解读监控数据:优化并发延迟的策略 1. 检查CPU情况2. 检查网络情况3. 检查系统情况4. 检查连接数5. 检查持久化 :6. 检查命令执行情况 0.前言 Redis 6.0版本之前其使用单…...
碰到一个逆天表中表数据渲染
1. 逆天表中表数据问题 我有一个antd-table组件,他的编辑可以打开一个编辑弹窗打开弹窗里面还会有一个表格,如果这个表格的column是在外层js文件中保存的话,那么第一次打开会正常渲染数据,再次打开就不会渲染,即使是已…...
记录我常用的免费API接口
目录 1.随机中英文句子 2.随机中英文句子(带图片和音频) 3.随机一句诗 4.随机一句话 5.随机一句情话 6. 随机一句舔狗语录 7.历史上的今天 8.获取来访者ip地址 9:获取手机号信息 10. 垃圾分类查询 11.字典查询 12.QQ信息查询 1.随…...
编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载
编程的简单实例,编程零基础入门教程,中文编程开发语言工具下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件&…...
创芯科技USB_CAN【库文件】
只用到【只收】【只发】功能 23.11.18 using help; //using Models; using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Sys…...
React整理总结(四)
1.过渡动画react-transition-group Transition 与平台无关,不一定使用css实现CSSTransition组件,in属性控制展示隐藏,添加className;有三个状态appear | enter | exit 第一类,开始状态:对于的类是-appear、…...
ajax,axios,fetch
文章目录 ajax工作原理ajax发请求四个步骤创建xmlhttprequest对象设置请求方式设置回调函数发送请求 自封装ajax axiosaxios 特性如何用配置拦截器fetch 三者区别 ajax 工作原理 Ajax的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务…...
Java值传递和引用传递
在Java中,有值传递(Pass-by-Value)和引用传递(Pass-by-Reference)两种参数传递方式。 值传递(Pass-by-Value):当使用值传递方式时,方法将参数的副本传递给调用方法。这意…...
FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1)
FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) 单字节写时序单字节读时序I2C 控制器设计模块框图scl_high 和 scl_low 产生的时序图状态转移图 Verilog代码 FPGA_IIC代码-正点原子 野火 小梅哥 特权同学对比写法(1) FPG…...
LabVIEW编程开发NI-USRP
LabVIEW编程开发NI-USRP 可编程性是SDR的关键特性,它使人们能够将无线电外围设备转换为先进的无线系统。USRP是市场上最开放、最通用的SDR,可帮助工程师在主机和FPGA上使用各种软件开发工具构建系统。 有多种选项可用于对基于SDR的系统的主机进行编程。…...
百考通:AI一键生成期刊论文写作,全流程智能化支撑,让学术创作更高效
在学术研究领域,期刊论文的撰写是成果输出的关键环节,却也让众多科研工作者与学生倍感压力:选题迷茫、逻辑梳理困难、格式规范复杂、内容提炼耗时,严重拖慢了学术成果的发表节奏。百考通(https://www.baikaotongai.com…...
使用curl命令直接调试taotoken大模型api接口的详细方法
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用curl命令直接调试Taotoken大模型API接口的详细方法 对于需要在无SDK环境下进行底层调试、自动化脚本编写或快速验证接口的开发…...
Flux1-dev高效优化方案:24GB以下显存的深度学习推理实战指南
Flux1-dev高效优化方案:24GB以下显存的深度学习推理实战指南 【免费下载链接】flux1-dev 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/flux1-dev Flux1-dev是为24GB以下VRAM环境深度优化的轻量级AI模型,集成了双文本编码器ÿ…...
Claude Code 终端命令完整指南
引言最初是为了方便我个人学习使用Claude Code才去网络上收集各种终端命令,但想到可能有人同样需要知道这些命令,便打算将其整理发到CSDN上,希望能帮到大家。 有点标题党的是本文并不是真的完整指南,毕竟完整的命令太多了…...
使用curl命令快速测试Taotoken大模型API的连通性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用curl命令快速测试Taotoken大模型API的连通性 在将大模型能力集成到应用之前,验证API的连通性和基本功能是必不可少…...
Unity 2D物理关节底层原理与实战避坑指南
1. 为什么2D物理关节不是“加个组件就完事”——从一个弹球卡墙的bug说起我第一次在Unity里拖进一个HingeJoint2D,想做个旋转门,结果运行时门直接飞出屏幕,撞上墙后像被磁铁吸住一样死死贴着不动。当时以为是刚体质量设错了,调了半…...
VisualTFT自定义圆形进度条:Canvas绘图与嵌入式GUI开发实践
1. 项目概述与核心价值最近在做一个工业HMI的项目,客户要求在设备启动自检的界面上,用一个圆环形的进度条来展示自检进度,而不是传统的长条状进度条。他们觉得圆环看起来更“高级”,也更符合他们产品的整体UI风格。接到这个需求&a…...
Windows 11 LTSC版终极解决方案:三分钟恢复完整Microsoft Store体验
Windows 11 LTSC版终极解决方案:三分钟恢复完整Microsoft Store体验 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 还在为Windows 11 LTS…...
仿冒 Word 钓鱼攻击中可信远程工具滥用机理与企业防御研究
摘要 2026 年 5 月安全事件监测显示,以仿冒 Word 在线页面为诱饵、滥用合法远程管理工具实现内网渗透的新型钓鱼攻击,正成为企业安全防护的典型盲区。该攻击以 Outlook 钓鱼邮件为入口,诱导用户访问伪造的 Word Online/OneDrive 预览页面&…...
3个关键问题解析:如何用PlantUML Editor提升UML设计效率
3个关键问题解析:如何用PlantUML Editor提升UML设计效率 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 你是否曾在UML设计过程中陷入这样的困境:花费大量时间调整…...
