안녕하세여! ffmpeg를 이용한 비디오(mp4)콘버팅 질문입니다...
안녕하세여! ffmpeg를 이용한 비디오(mp4)콘버팅 질문입니다...
mp4파일을 만들려고 하는데요. 파일은 만들어지는것 같은데 아이폰 photosAlbum에 넣으려고 하면
지원되지 않는 포맷이라고 오류가 뜹니다... ㅠㅠ
실지 mp4파일로 변환이 안된거 같습니다. 파일 생성시 파일 헤더가 문제인지?
아래 소스코드를 올립니다. 고수님들 조언 부탁드립니다.....
- (void) exportMovie:(NSArray*)array inputSnd:(NSString*)inputSnd toPath:(NSString*)toPath imgSize:(CGSize)imgSize
{
AVCodec *codec;
AVCodecContext *c= NULL;
int i, out_size, size, outbuf_size;
FILE *f;
AVFrame *picture;
uint8_t *outbuf;
printf("Video encoding\n");
avcodec_init();
avcodec_register_all();
/* find the mpeg video encoder */
codec = avcodec_find_encoder(CODEC_ID_MPEG4); // 코덱설정
if (!codec) {
fprintf(stderr, "codec not found\n");
exit(1);
}
c= avcodec_alloc_context();
picture= avcodec_alloc_frame();
/* put sample parameters */
c->bit_rate = 400000;
/* resolution must be a multiple of two */
c->width = 240;
c->height = 320;//288;
/* frames per second */
c->time_base= (AVRational){1,25};
c->gop_size = 10; /* emit one intra frame every ten frames */
c->max_b_frames=1;
c->pix_fmt = PIX_FMT_YUV420P;
/* open it */
if (avcodec_open(c, codec) < 0) {
fprintf(stderr, "could not open codec\n");
exit(1);
}
f = fopen([toPath UTF8String], "wb");
if (!f) {
fprintf(stderr, "could not open %s\n", [toPath UTF8String]);
exit(1);
}
/* alloc image and output buffer */
outbuf_size = 100000;
outbuf = malloc(outbuf_size);
size = c->width * c->height;
#pragma mark -
AVFrame* outpic = avcodec_alloc_frame();
int nbytes = avpicture_get_size(PIX_FMT_YUV420P, c->width, c->height);
//create buffer for the output image
uint8_t* outbuffer = (uint8_t*)av_malloc(nbytes);
#pragma mark -
for(i=1;i
fflush(stdout);
int numBytes = avpicture_get_size(PIX_FMT_YUV420P, c->width, c->height);
uint8_t *buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
UIImage *image = [array objectAtIndex:i];
//[UIImage imageNamed:[NSString stringWithFormat:@"10%d", i]];
CGImageRef newCgImage = [image CGImage];
CGDataProviderRef dataProvider = CGImageGetDataProvider(newCgImage);
CFDataRef bitmapData = CGDataProviderCopyData(dataProvider);
buffer = (uint8_t *)CFDataGetBytePtr(bitmapData);
avpicture_fill((AVPicture*)picture, buffer, PIX_FMT_RGB8, c->width, c->height);
avpicture_fill((AVPicture*)outpic, outbuffer, PIX_FMT_YUV420P, c->width, c->height);
struct SwsContext* fooContext = sws_getContext(c->width, c->height,
PIX_FMT_RGB8,
c->width, c->height,
PIX_FMT_YUV420P,
SWS_FAST_BILINEAR, NULL, NULL, NULL);
if( !fooContext )
return;
//perform the conversion
sws_scale(fooContext, picture->data, picture->linesize, 0, c->height, outpic->data, outpic->linesize);
// Here is where I try to convert to YUV
/* encode the image */
out_size = avcodec_encode_video(c, outbuf, outbuf_size, outpic);
printf("encoding frame %3d (size=%5d)\n", i, out_size);
fwrite(outbuf, 1, out_size, f);
free(buffer);
buffer = NULL;
}
/* 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, outbuf_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(outbuf);
avcodec_close(c);
av_free(c);
av_free(picture);
printf("\n");
}
// 아이폰 photosAlbum에 추가 ------------------------------ 여기서 포맷지원 오류
UISaveVideoAtPathToSavedPhotosAlbum ( savedVideoPath,self, @selector(video:didFinishSavingWithError: contextInfo:), nil);
감사합니다......
좋은 하루 되세요^^
제가 보기에는 파일 포맷이 mp4파일로 안되는거
제가 보기에는 파일 포맷이 mp4파일로 안되는거 같은데요...
그 이상은 잘 ...
화이팅^^
댓글 달기