2012-07-04 93 views
0

我試圖使用ffmpeg庫將圖像編碼爲視頻。 我有這些全球PARAMS:使用ffmpeg(sws_scale)將圖像編碼爲視頻

//Global params 
AVCodec   *codec; 
AVCodecContext *codecCtx; 
uint8_t   *output_buffer; 
int    output_buffer_size; 

我分了編碼3種方法: 初始化編碼器:

jint Java_com_camera_simpledoublewebcams2_CameraPreview_initencoder(JNIEnv* env,jobject thiz){ 
avcodec_register_all(); 
avcodec_init(); 
av_register_all(); 

int fps = 30; 

/* find the H263 video encoder */ 
codec = avcodec_find_encoder(CODEC_ID_H263); 
if (!codec) { 
    LOGI("avcodec_find_encoder() run fail."); 
    return -5; 
} 

//allocate context 
codecCtx = avcodec_alloc_context(); 

/* put sample parameters */ 
codecCtx->bit_rate = 400000; 
/* resolution must be a multiple of two */ 
codecCtx->width = 176; 
codecCtx->height = 144; 
/* frames per second */ 
codecCtx->time_base = (AVRational){1,fps}; 
codecCtx->pix_fmt = PIX_FMT_YUV420P; 
codecCtx->codec_id = CODEC_ID_H263; 
codecCtx->codec_type = AVMEDIA_TYPE_VIDEO; 

/* open it */ 
if (avcodec_open(codecCtx, codec) < 0) { 
    LOGI("avcodec_open() run fail."); 
    return -10; 
} 

//init buffer 
output_buffer_size = 500000; 
output_buffer = malloc(output_buffer_size); 

return 0; 

}

編碼圖像:

jint Java_com_camera_simpledoublewebcams2_CameraPreview_encodejpeg(JNIEnv* env,jobject thiz,jchar* cImage, jint imageSize){ 
int    out_size; 
AVFrame   *picture; 
AVFrame   *outpic; 
uint8_t   *outbuffer; 

//allocate frame  
picture = avcodec_alloc_frame();  
outpic = avcodec_alloc_frame(); 

int nbytes = avpicture_get_size(PIX_FMT_YUV420P, codecCtx->width, codecCtx->height); 
outbuffer = (uint8_t*)av_malloc(nbytes); 
outpic->pts = 0; 

//fill picture with image 
avpicture_fill((AVPicture*)picture, (uint8_t*)cImage, PIX_FMT_RGBA, codecCtx->width, codecCtx->height); 
//fill outpic with empty image 
avpicture_fill((AVPicture*)outpic, outbuffer, PIX_FMT_YUV420P, codecCtx->width, codecCtx->height); 

//rescale the image 
struct SwsContext* fooContext = sws_getContext(codecCtx->width, codecCtx->height, 
                 PIX_FMT_RGBA, 
                 codecCtx->width, codecCtx->height, 
                 PIX_FMT_YUV420P, 
                 SWS_FAST_BILINEAR, NULL, NULL, NULL); 
sws_scale(fooContext, picture->data, picture->linesize, 0, codecCtx->height, outpic->data, outpic->linesize); 

//encode the image 
out_size = avcodec_encode_video(codecCtx, output_buffer, output_buffer_size, outpic); 
out_size += avcodec_encode_video(codecCtx, output_buffer, output_buffer_size, outpic); 

//release pictures 
av_free(outbuffer); 
av_free(picture); 
av_free(outpic); 

return out_size; 

}

和關閉編碼器:

void Java_com_camera_simpledoublewebcams2_CameraPreview_closeencoder(JNIEnv* env,jobject thiz){ 
free(output_buffer); 
avcodec_close(codecCtx); 
av_free(codecCtx); 

}

當我首次發送圖像,我從編碼器的結果。當我嘗試發送另一個圖像時,程序崩潰。 我試着調用init一次,然後圖像,然後關閉 - 沒有工作。 我試圖調用init和每個圖像的close - 沒有工作。

有什麼建議嗎?

謝謝!

編輯:經過進一步的研究,我發現問題是在sws_scale方法。 還是不知道是什麼原因造成這個問題...

+0

hai bahar_p你是否得到了這個答案,我也面臨同樣的問題。這是我的郵件ID [email protected] – rams

回答

1

out_size = avcodec_encode_video(codecCtx,output_buffer,output_buffer_size,outpic);

out_size + = avcodec_encode_video(codecCtx,output_buffer,output_buffer_size,outpic);

你爲什麼要編碼兩次?

也許錯誤是由於雙重編碼。嘗試刪除第二個編碼。