Libavcodec can do it. This is the code from Anand, and his code only
use ffmpeg libs.
First I also think about libjpeg and found a jpeg library including
Anroid.mk to port to Android NDK (I'm working in android platform), but
I search in ffmpeg source code and see that it has the CODEC_ID_JPEG, so
I think it does not need to use libjpeg.
int WriteJPEG (AVCodecContext *pCodecCtx, AVFrame *pFrame, int FrameNo){
AVCodecContext *pOCodecCtx;
AVCodec *pOCodec;
uint8_t *Buffer;
int BufSiz;
int BufSizActual;
int ImgFmt = PIX_FMT_YUVJ420P; //for the
newer ffmpeg version, this int to pixelformat
FILE *JPEGFile;
char JPEGFName[256];
BufSiz = avpicture_get_size (
ImgFmt,pCodecCtx->width,pCodecCtx->height );
Buffer = (uint8_t *)malloc ( BufSiz );
if ( Buffer == NULL )
return ( 0 );
memset ( Buffer, 0, BufSiz );
pOCodecCtx = avcodec_alloc_context ( );
if ( !pOCodecCtx ) {
free ( Buffer );
return ( 0 );
}
pOCodecCtx->bit_rate = pCodecCtx->bit_rate;
pOCodecCtx->width = pCodecCtx->width;
pOCodecCtx->height = pCodecCtx->height;
pOCodecCtx->pix_fmt = ImgFmt;
pOCodecCtx->codec_id = CODEC_ID_MJPEG;
pOCodecCtx->codec_type = CODEC_TYPE_VIDEO;
pOCodecCtx->time_base.num = pCodecCtx->time_base.num;
pOCodecCtx->time_base.den = pCodecCtx->time_base.den;
pOCodec = avcodec_find_encoder ( pOCodecCtx->codec_id );
if ( !pOCodec ) {
free ( Buffer );
return ( 0 );
}
if ( avcodec_open ( pOCodecCtx, pOCodec ) < 0 ) {
free ( Buffer );
return ( 0 );
}
pOCodecCtx->mb_lmin = pOCodecCtx->lmin =
pOCodecCtx->qmin * FF_QP2LAMBDA;
pOCodecCtx->mb_lmax = pOCodecCtx->lmax =
pOCodecCtx->qmax * FF_QP2LAMBDA;
pOCodecCtx->flags = CODEC_FLAG_QSCALE;
pOCodecCtx->global_quality = pOCodecCtx->qmin * FF_QP2LAMBDA;
pFrame->pts = 1;
pFrame->quality = pOCodecCtx->global_quality;
BufSizActual = avcodec_encode_video(
pOCodecCtx,Buffer,BufSiz,pFrame );
sprintf ( JPEGFName, "%06d.jpg", FrameNo );
JPEGFile = fopen ( JPEGFName, "wb" );
fwrite ( Buffer, 1, BufSizActual, JPEGFile );
fclose ( JPEGFile );
avcodec_close ( pOCodecCtx );
free ( Buffer );
return ( BufSizActual );
}
I searched on google and saw that many people ask the same question but
not found the answer yet. So this will help for developer in the first
use ffmpeg libs
Hoang Ong
On 8/6/2010 12:20 AM, Michael Chisholm wrote:
Here we go again... :) Can't you use libavcodec's builtin mjpeg encoder?
On 8/5/2010 11:38 AM, Glen Ruedinger wrote:
You need libjpeg.
On Thu, Aug 5, 2010 at 10:58 AM, Hoang Ong<[email protected]>
wrote:
Hi everybody,
I can get the AVFrame and output it to a raw image file (.ppm) I try
to use
sws_scale to convert that image to variety of image type to save it
as a jpg
file but it not work. I think it not a way to do.
I dont have much knowledge about image processing. So anybody know
how to
use ffmpeg's libs to convert AVFrame to jpg please help me. The code
I used
to save frame as a ppm file like this:
void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame)
{
FILE *pFile;
char szFilename[32];
int y;
// Open file
sprintf(szFilename, "frame.ppm", iFrame);
pFile=fopen(szFilename, "wb");
if(pFile==NULL)
return;
// Write header
fprintf(pFile, "P6\n%d %d\n255\n", width, height);
// Write pixel data
for(y=0; y<height; y++)
fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3,
pFile);
// Close file
fclose(pFile);
}
Regards
Hoang Ong
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user