2012-04-10 140 views
0

我的任務: 通過ffmpeg將YUV幀數據轉換爲JPEG圖像。 我有什麼: 每個飛機的數據和每一個的lineize;YUV420P轉JPEG到ffmpeg

我試圖創建空的AVFrame並填充它的數據和lineize與這些信息,但編碼後與CODEC_ID_MJPEG編解碼器的圖像和保存到文件,沒有得到正確的JPEG。

我必須做些什麼來獲取圖像?

+0

您是否嘗試過運行實際將您的YUV幀轉換爲JPEG格式的ffmpeg命令? – 2012-04-10 15:49:14

+0

我不能這樣做,因爲我的YUV數據被分離到不同的文件(每幀有3個文件與Y數據的U數據和V數據,他們的行數顯示在他們的文件名) – mmmaaak 2012-04-10 15:52:28

+0

嗯,我會寫代碼合併所有三個,不應該很難。因爲如果你不能在cmd中測試它,那麼編碼的可能性就會降低。 – 2012-04-10 16:01:08

回答

-1

您需要縮放圖像以使用`libswscale獲取正確的JPEG文件。我的一個answer可以幫助你。選擇合適的像素格式

0

也許你應該使用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是LINESIZE。

+0

intresting代碼,但它不起作用 – Alon 2014-10-08 10:00:50

+0

這是非常接近,但它與我的測試驅動程序生成的圖像是黑色和白色。 – spartygw 2015-08-07 03:40:49