LINUX.ORG.RU

ffmpeg создание видео


0

0

Возникла проблема: надо из картинок разных форматов и размеров создать видеофайл...происходит всё под виндой...в Visual Studio 2010...ну я подключил все либы и инклуды...вот код:
#define FILE_NAME_0 «C:\\temp\\0.bmp»
#define FILE_NAME_1 «C:\\temp\\1.bmp»
#define FILE_NAME_2 «C:\\temp\\2.bmp»
#define FILE_NAME_3 «C:\\temp\\3.bmp»
#define FILE_NAME_4 «C:\\temp\\4.bmp»
#define FILE_NAME_5 «C:\\temp\\5.bmp»
#define FILE_NAME_6 «C:\\temp\\6.bmp»
#define FILE_NAME_7 «C:\\temp\\7.bmp»
#define FILE_NAME_8 «C:\\temp\\8.bmp»
#define FILE_NAME_9 «C:\\temp\\9.bmp»
#define FILE_SAVE_VIDEO
#define CODEC_ID CODEC_ID_MPEG2VIDEO
void main(void)
{   av_register_all();
   AVFormatContext *oc;
   AVCodecContext *c=avcodec_alloc_context();
AVStream *st=NULL;
   AVOutputFormat *fmt;
   oc=av_alloc_format_context();

fmt = guess_format(NULL, «C:\\temp\\2.avi», NULL);
       oc->oformat = fmt;

st = av_new_stream(oc, 0);
if (!st)
   {
fprintf(stderr, «Could not alloc stream\n»);
      getch();
return;
}

   c = st->codec;
   c->codec_id = CODEC_ID;
c->codec_type = CODEC_TYPE_VIDEO;
c->bit_rate = 9676800;
   c->bit_rate_tolerance=1000000;
c->width = 720;
c->height = 280;
c->time_base.den = 2; //по умолчанию должно быть 25
c->time_base.num = 1;

   c->pix_fmt = PIX_FMT_YUV420P;
   AVCodec *codec1=NULL;
   codec1=avcodec_find_decoder(c->codec_id);
   avcodec_open(c,codec1);

   if (!(fmt->flags & AVFMT_NOFILE))
   {
      if (url_fopen(&oc->pb, «C:\\temp\\2.avi», URL_WRONLY) < 0)
      {
         printf(«Could not open C:\\temp\\2.avi \n»);
         getch();
         return;
      }
   }
   av_write_header(oc);

   for(int i=0 ; i<10 ; i++)
   {
      AVFormatContext *oc1;
      const char *filename;

      switch(i)
      {
         case 0: filename=FILE_NAME_0; break;
         case 1: filename=FILE_NAME_1; break;
         case 2: filename=FILE_NAME_2; break;
         case 3: filename=FILE_NAME_3; break;
         case 4: filename=FILE_NAME_4; break;
         case 5: filename=FILE_NAME_5; break;
         case 6: filename=FILE_NAME_6; break;
         case 7: filename=FILE_NAME_7; break;
         case 8: filename=FILE_NAME_8; break;
         case 9: filename=FILE_NAME_9; break;
      }
      AVFormatContext *pFormatCtx;
    av_open_input_file(&pFormatCtx,filename,NULL,0,NULL);
av_find_stream_info(pFormatCtx);
    dump_format(pFormatCtx,0,filename,false);
    int videoStream;
    AVCodecContext *pCodexCtx=avcodec_alloc_context();
    videoStream = -1;
    for(int j=0;j<pFormatCtx->nb_streams;j++)
      {
          if(pFormatCtx->streams[j]->codec->codec_type==CODEC_TYPE_VIDEO)
         {
            videoStream=j;
            break;
         }
      }
             pCodexCtx=pFormatCtx->streams[videoStream]->codec;
      AVCodec *pCodec=NULL;
      pCodec=avcodec_find_decoder(pCodexCtx->codec_id);
      avcodec_open(pCodexCtx,pCodec);

      AVFrame *frame1=avcodec_alloc_frame();
      AVFrame *frame2=avcodec_alloc_frame();

      int numBytes = avpicture_get_size(c->pix_fmt, c->width,c->height);
    uint8_t *buffer1 = new uint8_t[numBytes];
      avpicture_fill((AVPicture *)frame1, buffer1,c->pix_fmt ,c->width, c->height);

      numBytes = avpicture_get_size(pCodexCtx->pix_fmt, pCodexCtx->width,pCodexCtx->height);
    uint8_t *buffer2 = new uint8_t[numBytes];
      avpicture_fill((AVPicture *)frame2, buffer2,pCodexCtx->pix_fmt ,pCodexCtx->width, pCodexCtx->height);

      int finish=0;
      AVPacket packet;
      av_init_packet(&packet);
      int a=av_read_frame(pFormatCtx,&packet);

      a= avcodec_decode_video(pCodexCtx, frame2, &finish, packet.data, packet.size);
avcodec_encode_video(pCodexCtx,packet.data,packet.size,frame2);
      if (pCodexCtx->pix_fmt != PIX_FMT_YUV420P)
      {
         static struct SwsContext *swscontext;
         if (swscontext == NULL)
         {
            swscontext = sws_getContext(pCodexCtx->width,pCodexCtx->height,pCodexCtx->pix_fmt,c->width,c->height,c->pix_fmt,SWS_BICUBIC, NULL, NULL, NULL);
            sws_scale(swscontext, frame2->data, frame2->linesize, 0 ,pCodexCtx->height, frame1->data, frame1->linesize);
         }
      }

      AVCodecContext *dec=avcodec_alloc_context();

      dec->bit_rate = c->bit_rate;
      dec->width = c->width;
      dec->height = c->height;
      dec->pix_fmt = PIX_FMT_YUV420P;
      dec->codec_id = CODEC_ID_MPEG2VIDEO;
      dec->codec_type = CODEC_TYPE_VIDEO;
      dec->time_base.num = c->time_base.num;
    dec->time_base.den = c->time_base.den;
      dec->flags |= CODEC_FLAG_QSCALE;

      AVCodec *decCodec;
      decCodec = avcodec_find_encoder(c->codec_id);
      avcodec_open(dec, decCodec);

      AVPacket pkt;
av_init_packet(&pkt);

pkt.flags |= PKT_FLAG_KEY;
pkt.stream_index= st->index;
      numBytes=avpicture_get_size(PIX_FMT_YUV420P, c->width,c->height);
      uint8_t *buffer3=new uint8_t[numBytes];

      avcodec_encode_video(dec,buffer3 ,numBytes ,frame1);
      pkt.data=buffer3;
pkt.size= numBytes;

av_interleaved_write_frame(oc, &pkt);

      av_free_packet(&packet);
      av_free_packet(&pkt);
      avcodec_close(pCodexCtx);
      av_close_input_file(pFormatCtx);
      //getch();
   }

   av_write_trailer(oc);
   getch();
if (!(fmt->flags & AVFMT_NOFILE))
   {
url_fclose(oc->pb);
}
   return;
}

...
Вот, а валится всё на avcodec_encode_video .... скажите что не так делаю...и не надо смеятся , я вторую неделю разбираюсь с ffmpeg...

Из командной строки не проще будет, чем горы кода плодить?

Pantserovik ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.