【问题标题】:Opengl sws_scale is not working (segmentation fault)Opengl sws_scale 不工作(分段错误)
【发布时间】:2020-07-19 07:24:36
【问题描述】:

我正在开发一个 OpenGL 视频应用程序,我想在其中以全屏模式呈现视频。我正在尝试使用以下代码渲染视频:

GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwWindowHint(GLFW_RED_BITS, mode->redBits);
glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits);
glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits);
glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate);

但是,当我尝试缩放视频帧时,它会产生分段错误。 我正在使用ffmpegsws 比例尺进行颜色转换。

sws_scaler_ctx = sws_getContext(width, height, av_codec_ctx->pix_fmt,
                                width, height, AV_PIX_FMT_RGB0,
                                SWS_FAST_BILINEAR, NULL, NULL, NULL);

uint8_t* dest[4] = { frame_buffer, NULL, NULL, NULL };
int dest_linesize[4] = { width*4, 0, 0, 0 };
sws_scale(sws_scaler_ctx, av_frame->data, av_frame->linesize, 0, av_frame->height, dest, dest_linesize);

有谁知道为什么在尝试缩放视频帧时会导致分段错误?

【问题讨论】:

  • 如何分配frame_buffer
  • 嗨,我定义了帧缓冲区uint8_t* frame_buffer。也以uint8_t* frame_buffer= new uint8_t[frame_width * frame_height * 4]; 发起。
  • assert(frame_width == width && frame_height == height)?
  • @ybungalobill 它在我缩放时产生了错误。当我缩放视频帧并尝试将该帧转换为定义的高度和宽度时,它不起作用或转换这就是它产生此错误的原因。如果是因为我的显卡?
  • 您的代码在 CPU 上扩展,因此您的显卡无法使用。我怀疑你想缩放你的框架,但你的代码不正确——你将相同的宽度和高度传递给sws_getContext,用于源和目标。尝试修复它?

标签: c++ opengl ffmpeg rendering video-capture


【解决方案1】:
 sws_scale(data->conv_ctx, data->av_frame->data, data->av_frame->linesize, 0,
                          data->codec_ctx->height, data->gl_frame->data, data->gl_frame->linesize);

它正在缩放 Windows 监视器并解决我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2018-09-14
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多