sdl-2 - 使用 SDL 流式传输 UYVY 视频
问题描述
我正在尝试使用 v4l2 从相机捕获图像数据的程序。我抓取了 4 帧并将它们存储在连续内存的缓冲区中。缓冲区中图像的数据格式为UYVY。我需要帮助来了解映射图像缓冲区或将它们复制到纹理中要遵循的步骤,以便我可以像视频一样流式传输它们。
我尝试将 UYVY 文件转换为 BMP 格式并使用 SDL_loadBMP() 函数将它们流式传输,但帧速率非常低。
编辑:这是 SDL 的代码:
“buf”是由 bmp 图像数据组成的图像缓冲区。我已经将 UYVY 文件转换为 BMP 并通过这里。我需要帮助直接流式传输 UYVY。
void video_stream(unsigned char* buf){
SDL_Surface *image;
SDL_Surface * screen;
SDL_Renderer *renderer;
SDL_Texture* texture;
SDL_Window *window;
SDL_RWops* rw;
SDL_Rect recta;
SDL_Init(SDL_INIT_EVERYTHING);
recta.x=0;
recta.y=0;
recta.w=s_format.fmt.pix.width;
recta.h=s_format.fmt.pix.height;
window=SDL_CreateWindow("Streaming", 0, 0, s_format.fmt.pix.width, s_format.fmt.pix.height, SDL_WINDOW_RESIZABLE);
rw=SDL_RWFromMem(buf,s_format.fmt.pix.width*s_format.fmt.pix.height*NUMBER_OF_BYTES_PER_PIXEL+OFFSET);
renderer=SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
SDL_RenderSetLogicalSize(renderer,s_format.fmt.pix.width,s_format.fmt.pix.height);
SDL_SetRenderDrawColor(renderer,0,0,0,50);
SDL_RenderClear(renderer);
image=SDL_LoadBMP_RW(rw,1);
texture=SDL_CreateTextureFromSurface(renderer,image);
SDL_RenderCopy(renderer,texture,NULL,&recta);
SDL_RenderPresent(renderer);
SDL_DestroyRenderer(renderer);
SDL_FreeSurface(image);
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
解决方案
SDL_CreateTexture()
与SDL_PIXELFORMAT_UYVY
. 使用 . 上传新帧SDL_UpdateTexture()
。使用SDL_RenderCopy
.
您可以使用SDL_TEXTUREACCESS_STREAMING
和SDL_LockTexture()
/SDL_UnlockTexture()
来加速纹理更新。
推荐阅读
- office365 - 如何保护 Office 加载项/防止其他公司安装或使用它
- quantum-computing - 密度矩阵与完整性关系的区别
- javascript - 对 SharePoint 搜索 API 的请求中的 SourceId 是什么?
- html - 字体真棒字体
- python - 正负值用不同颜色的散点图
- laravel - Facade\Ignition\Exceptions\ViewException 试图获取非对象的属性“name_category”
- javascript - 按_id(MongoDB,Node,React)错误显示特定用户:模型“user”的路径“_id”处的值“undefined”转换为ObjectId失败
- swiftui - 如何将图像大小设置为 SwiftUI 中行宽的 1/3?
- html - 如何使图像变暗并用文字掩盖它?
- c# - (接口)检测到类型服务的循环依赖