В общем, есть задача нарезать скриншотов с видео файла.
Все как бы получилось, но вот проблемка есть с тем, что файлы исходные нужно сохранять в jpeg формате,а я добился только сохранения в ppm.
Вот мой код, после инициализации, загрузки кодека и прочей не относящейся к делу лабуды (большая часть кода на основе статьи Martin'a Böhme):
//Фреймы
AVFrame *pFrame;
AVFrame *pFrameRGB;
pFrame=avcodec_alloc_frame();
pFrameRGB=avcodec_alloc_frame();
int frameFinished;
int numBytes;
numBytes = avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,pCodecCtx->height);
uint8_t *buffer = new uint8_t[numBytes];
int h = pCodecCtx->height;
int w = pCodecCtx->width;
// Assign appropriate parts of buffer to image planes in pFrameRGB
avpicture_fill((AVPicture *)pFrameRGB, buffer,PIX_FMT_RGB24,pCodecCtx->width, pCodecCtx->height);
// Read frames and save first five frames to disk
AVPacket packet;
i=0;
struct SwsContext *img_convert_ctx = NULL;
while(av_read_frame(pFormatCtx, &packet)>=0)
{
// Is this a packet from the video stream?
if(packet.stream_index==videoStream)
{
// Decode video frame
avcodec_decode_video(pCodecCtx, pFrame, &frameFinished,
packet.data, packet.size);
// Did we get a video frame?
if(frameFinished)
{
if(img_convert_ctx == NULL) //Создаем контекст для конвертирования
img_convert_ctx = sws_getContext(w, h,pCodecCtx->pix_fmt, w, h,PIX_FMT_RGB24,SWS_BICUBIC, NULL, NULL, NULL);
//Конвертируем
sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize,
0, h , pFrameRGB->data, pFrameRGB->linesize);
// Сохраняем на диск
if(++i<=atoi(argv[2]))
SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height,i);
}
}
av_free_packet(&packet);
}
Вот так сохраняю в файл:
void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame)
{
FILE *pFile;
char szFilename[32];
int y;
// Open file
sprintf(szFilename, "frame%d.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);
}
Подскажите пожалуйста, как я могу запихнуть данные, которые в pFrame->data[0] не в ppm, а в jpeg формат? Или возможно есть другой способ?
>>>