【问题标题】:Streaming UYVY video using SDL使用 SDL 流式传输 UYVY 视频
【发布时间】:2018-08-03 12:52:37
【问题描述】:

我正在尝试使用 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-2 v4l2


【解决方案1】:

SDL_CreateTexture()SDL_PIXELFORMAT_UYVY。使用SDL_UpdateTexture() 上传新帧。使用SDL_RenderCopy 渲染。

您可以使用SDL_TEXTUREACCESS_STREAMINGSDL_LockTexture()/SDL_UnlockTexture() 来加速纹理更新。

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 2016-09-24
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2016-12-02
    • 2011-03-12
    相关资源
    最近更新 更多