ffmpeg создание видео
Возникла проблема: надо из картинок разных форматов и размеров создать видеофайл...происходит всё под виндой...в 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...