私のタスク: YUV フレーム データを ffmpeg で jpeg 画像に変換します。私が持っているもの:すべての平面とそれぞれの線サイズのデータ。
空の AVFrame を作成し、そのデータとラインサイズにこの情報を入力しようとしましたが、CODEC_ID_MJPEG コーデックで画像にエンコードしてファイルに保存した後、正しい jpeg を取得できませんでした。
画像を取得するにはどうすればよいですか?
たぶん、これを行うにはjpeglibを使用する必要があります。これが私のコードです
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
はラインサイズです。
libswscale を使用して適切な JPEG ファイルを取得するには、画像をスケーリングする必要があります。私の答えの1つがこれに役立ちます。適切なPIXEL FORMATを選択します。