我有一个程序,我有一个GLFW窗口,使用glReadPixels(0, 0,window_width, window_height, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) Buffer);
读取该窗口,然后使用Buffer
通过ffmpeg对帧进行编码.它工作得很好,但分辨率有点低.
我试着改变比特率,但无济于事,所以我开始try 格式.通常我在我的编码器中使用AV_PIX_FMT_YUV420P
作为我的格式,因为来自glfw窗口的数据是RGBA,但这种格式导致了上述低分辨率视频.结果视频比在GLFW窗口上看到的要像素化得多.
读取GLFW窗口的最佳像素格式是什么?有些格式笔直向上不工作,导致Specified pixel format yuyv422 is invalid or not supported
错误.
这就是我的错误所在:
ret = avcodec_open2(c, codec, &opt);
当我使用YUV420以外的代码时,这行代码会导致我得到Specified pixel format yuyv422 is invalid or not supported
错误.
我也有这个设置#define SCALE_FLAGS SWS_BICUBIC
,我不确定它是做什么的,但也可能导致我的错误.(不太可能,因为这是在上面提到的行之后,但我可以将格式保留为YUV420并改为更改SWS_BICUBIC
.)
我正在使用ubuntu、ffmpeg、glfw和grear(GLSL)来渲染帧中写入的纹理.我从ffmpegs muxing.c示例中得到了编码器.
编辑:使用AV_PIX_FMT_RGBA
也会导致类似的错误.
编辑:以下是我将Buffer
转换为ffmepg格式的示例代码:
#define STREAM_PIX_FMT AV_PIX_FMT_YUV420P
...
void video_encoder::set_frame_yuv_from_rgb(AVFrame *frame, struct SwsContext *sws_context) {
const int in_linesize[1] = { 4 * width };
sws_context = sws_getContext(
width, height, AV_PIX_FMT_RGBA,
width, height, STREAM_PIX_FMT,
SWS_BICUBIC, 0, 0, 0);
sws_scale(sws_context, (const uint8_t * const *)&rgb_data, in_linesize, 0,
height, frame->data, frame->linesize);
}