Hi,

I have a series of png files and would like to encode them to a video file.
most of the examples cover encoding a raw video file. However, I couldnt
find one that covers using existing still images (especially PNG). Attached
is the sample code that i found. can someone help me ?

Thanks and Regards,
Boys21.
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 
 #ifdef HAVE_AV_CONFIG_H
 #undef HAVE_AV_CONFIG_H
 #endif
 
 #include "libavcodec/avcodec.h"
 #include "libavutil/mathematics.h"
 
 #define FRAME_RATE 30
 #define DURATION 5


static void givePNG(char * filename){

// I have still images in local machine, but how to deliver them such that avFrame can understand it?

}


static void video_encode()
 {
     AVCodec *codec;
     AVCodecContext *c= NULL;
     int i, out_size, size, x, y, outbuf_size;
     FILE *f;
     AVFrame *picture;
     uint8_t *outbuf, *picture_buf;
 
     printf("Video encoding\n");
 
codec = avcodec_find_encoder(CODEC_ID_H264);            // finding the H264 encoder
if (!codec) {
    fprintf(stderr, "Codec not found\n");
    exit(1);
}
else printf("H264 codec found\n");

c = avcodec_alloc_context3(codec);
c->bit_rate = 400000;
c->width = 1280;                                        // resolution must be a multiple of two (1280x720),(1900x1080),(720x480)
c->height = 720;					// Height
c->time_base.num = 1;                                   // framerate numerator
c->time_base.den = 25;                                  // framerate denominator
c->gop_size = 10;                                       // emit one intra frame every ten frames
c->max_b_frames = 1;                                    // maximum number of b-frames between non b-frames
c->keyint_min = 1;                                      // minimum GOP size
c->i_quant_factor = (float)0.71;                        // qscale factor between P and I frames
c->b_frame_strategy = 20;                               // find out exactly what this does
c->qcompress = (float)0.6;                              // find out exactly what this does
c->qmin = 20;                                           // minimum quantizer
c->qmax = 51;                                           // maximum quantizer
c->max_qdiff = 4;                                       // maximum quantizer difference between frames
c->refs = 4;                                            // number of reference frames
c->trellis = 1;                                         // trellis RD Quantization
c->pix_fmt = PIX_FMT_YUV420P;                           // universal pixel format for video encoding
c->codec_id = CODEC_ID_H264;
c->codec_type = AVMEDIA_TYPE_VIDEO;

 
if (avcodec_open2(c, codec,NULL) < 0) {
    fprintf(stderr, "Could not open codec\n");          // opening the codec
    exit(1);
}
else printf("H264 codec opened\n");


    /* alloc image and output buffer */
     outbuf_size = 100000;
     outbuf = malloc(outbuf_size);
     size = c->width * c->height;
     picture_buf = malloc((size * 3)/2); /* size for YUV 420 */


    /*open the file to write the encoded images*/

	f = fopen("test.mpg","wb");                        // opening video file for writing
	if(!f) printf("[x] - Unable to open the file\n");
	else printf("Opened video file for writing\n");

    /* Navigate through each image and encode it */

	for(i=0;i<FRAME_RATE*DURATION;i++) {
		fflush(stdout); // flush buffers if any.

		//givePNG(); here
                // Confused how to change it to avframe compliant and push it to encoder.   


         /* encode the image */
         out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
         printf("encoding frame %3d (size=%5d)\n", i, out_size);
         fwrite(outbuf, 1, out_size, f);
     
}
  /* get the delayed frames */
     for(; out_size; i++) {
         fflush(stdout);
 
         out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
         printf("write frame %3d (size=%5d)\n", i, out_size);
         fwrite(outbuf, 1, out_size, f);
     }
 
     /* add sequence end code to have a real mpeg file */
     outbuf[0] = 0x00;
     outbuf[1] = 0x00;
     outbuf[2] = 0x01;
     outbuf[3] = 0xb7;
     fwrite(outbuf, 1, 4, f);
     fclose(f);
     free(picture_buf);
     free(outbuf);
 
     avcodec_close(c);
     av_free(c);
     av_free(picture);
     printf("\n");
 }


int main(int argc, char **argv)
 {
   
     /* must be called before using avcodec lib */
     avcodec_init();
 
     /* register all the codecs */
     avcodec_register_all();
     video_encode();

     return 0;
 }

 
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to