首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用ffmpeg将YUV420P转换为JPEG

用ffmpeg将YUV420P转换为JPEG
EN

Stack Overflow用户
提问于 2012-04-10 23:43:25
回答 2查看 3.3K关注 0票数 0

我的任务:通过ffmpeg将YUV帧数据转换为jpeg图像。我有:每个平面的数据和每个平面的线条大小;

我尝试创建空的AVFrame,并用这些信息填充它的数据和线条大小,但在用CODEC_ID_MJPEG编解码器将其编码为图像并将其保存到文件后,无法获得正确的jpegs。

要获取图像,我必须做些什么?

EN

回答 2

Stack Overflow用户

发布于 2013-01-12 21:49:41

也许你应该使用jpeglib来做这件事。这是我的代码

代码语言:javascript
运行
复制
FILE *outfile = fopen(path, "wb+");

if (!outfile)
    return 1;
h &= ~15;

struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;

cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);

cinfo.image_width = w; 
cinfo.image_height = h;
cinfo.input_components = 3;        
cinfo.in_color_space = JCS_YCbCr;

jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, 90, TRUE);
cinfo.dct_method = JDCT_FASTEST; 

cinfo.raw_data_in = TRUE;
cinfo.comp_info[0].h_samp_factor = 2; 
cinfo.comp_info[0].v_samp_factor = 2; 
cinfo.comp_info[1].h_samp_factor = 1; 
cinfo.comp_info[1].v_samp_factor = 1; 
cinfo.comp_info[2].h_samp_factor = 1; 
cinfo.comp_info[2].v_samp_factor = 1; 

int i, j;
JSAMPROW y[16], cb[16], cr[16];
JSAMPARRAY p[3];

jpeg_start_compress(&cinfo, TRUE);
p[0] = y;
p[2] = cb;
p[1] = cr;

for (j = 0; j < cinfo.image_height; j += 16) {
    for (i = 0; i < 16; i++) {
        y[i] = data[0] + line[0]*(i+j);
        cr[i/2] = data[1] + line[1]*((i+j)/2);
        cb[i/2] = data[2] + line[2]*((i+j)/2);
    }
    jpeg_write_raw_data(&cinfo, p, 16);
}

jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);

其中data是YUV平面数据,line是线大小。

票数 0
EN

Stack Overflow用户

发布于 2012-04-11 00:32:49

您需要使用` `libswscale缩放图像以获得适当的JPEG文件。我的一个answer可以帮你解决这个问题。选择适当的像素格式

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10091941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档