如何解决尝试将 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 举报,一经查实,本站将立刻删除。