В общем, есть задача нарезать скриншотов с видео файла.
Все как бы получилось, но вот проблемка есть с тем, что файлы исходные нужно сохранять в 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 формат?  Или возможно есть другой способ? 
    
      Ответ на:
      
          комментарий
        от anonymous 
  
    
      Ответ на:
      
          комментарий
        от mv 
  
    
      Ответ на:
      
          комментарий
        от dont 
  
    
      Ответ на:
      
          комментарий
        от dont 
  
    
      Ответ на:
      
          комментарий
        от dont 
  
    
      Ответ на:
      
          комментарий
        от mv 
  
    
      Ответ на:
      
          комментарий
        от mv 
  
    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум ffmpeg change resolution (2012)
 - Форум libav* (2011)
 - Форум ffmpeg создание видео (2010)
 - Форум YUV -> RGB преобразование кадров (2013)
 - Форум Кодирование видео с помощью libav* (2011)
 
- Форум Си AVFrame + sws_scale + (видимо кривые руки) = segfault (2013)
 - Форум ffmpeg library оптимизация декодирование H.264 для встраемых систем (2015)
 - Форум Не пойму, откуда взять последний аргумент для glTexImage2D (2011)
 - Форум Как использовать vdpau в ffmpeg? (2024)
 - Форум Как повысить разрешение веб-камеры? (2023)