尝试将 OpenGL FBO 编码为视频时遇到 src_linesize 断言错误

如何解决尝试将 OpenGL FBO 编码为视频时遇到 src_linesize 断言错误

我在使用 libavcodec 将 openGL FBO 编码到视频中时遇到了问题。我遵循了此处列出的示例 https://stackoverflow.com/a/36488003/9666630,但我针对我的用例对其进行了简化。 我将代码精简到 50 行,您可以假设我正在检查和处理错误

int WIDTH = 256; int HEIGHT = 256;
FILE *f;
... sets up file & other variables...
codec = avcodec_find_encoder(AV_CODEC_ID_MPEG1VIDEO);
CodecContext = avcodec_alloc_context3(codec);
CodecContext->pix_fmt = AV_PIX_FMT_YUV420P;
... sets up context some more ...
avcodec_open2(c,codec,NULL)
frame = av_frame_alloc();
frame->format = AV_PIX_FMT_RGB24;
... sets up frame width and height etc...
ret = av_image_alloc(frame->data,frame->linesize,CodecContext->width,CodecContext->height,CodecContext->pix_fmt,32);
for(i=0;i<25;i++) {     /* encode 1 second of video */
    fflush(stdout);
    size_t i,j,k,cur_gl,cur_rgb,nvals;
    const size_t format_nchannels = 3;
    nvals = format_nchannels * WIDTH * HEIGHT;
    glubyte**  pixelsPtr = &pixels;
    glubyte**  rgbPtr = &rgb;
    *pixelsPtr = (glubyte *)realloc(*pixelsPtr,nvals * sizeof(glubyte));
    *rgbPtr = (glubyte *)realloc(*rgbPtr,nvals * sizeof(uint8_t));
    // I draw an image to window before any of this code. (that is to say there are pixels to read)
    glreadPixels(0,WIDTH,HEIGHT,GL_RGB,GL_UNSIGNED_BYTE,*pixelsPtr);
    for(i=0;i<c->height;i++) {
        for(j=0;j<c->width;j++) {
            cur_gl  = format_nchannels * (WIDTH * (HEIGHT - i - 1) + j);
            cur_rgb = format_nchannels * (WIDTH * i + j);
            for (k = 0; k < format_nchannels; k++)
                frame->data[k][y * frame->linesize[k] + x] =(*pixelsPtr)[cur_gl + k];
        }
    }
    ffmpeg_encoder_set_frame_yuv_from_rgb(rgb);
    frame->pts = 25; 
    av_init_packet(&pkt);
    pkt.data = NULL; pkt.size = 0;
    // ERROR IS HAPPENING IN THIS NEXT LINE OF CODE
    ret = avcodec_encode_video2(CodecContext,&pkt,frame,&got_output);
    fwrite(pkt.data,1,pkt.size,f);
}
... get the delayed frames write the end code close the files and free what needs to be freed

我得到的错误

Assertion ((src_linesize) >= 0 ? (src_linesize) : (-(src_linesize))) >= bytewidth Failed
 at C:/Users/theka/mabs/build/ffmpeg-git/libavutil/imgutils.c:349

它发生在我调用 avcodec_encode_video2 时(在上面的伪代码标记)我也明白这是否不足以调试让我知道我是否可以提供其他任何信息。

我一直在努力确保数据格式正确,因此我将帧从 rbg24 转换为 yuv420。我检查了 frame 中的 linesize,所以由于 linesize 是一个列表,前三个值是 256、128 和 128,其余的都是 0,但我认为这没关系,因为只有 3 个通道。 任何见解表示赞赏。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?