-
FFmpeg으로 트랜스코딩하는 프로그램 만들기Streaming Media/Media Tools 2013. 6. 21. 13:50
선행 학습
예제 코드
static AVFormatContext *fmt_ctx = NULL; static AVCodecContext *dec_ctx = NULL; static int vst_idx = -1; void open_input_file() { AVCodec *dec; /* open input streams */ avformat_open_input(&fmt_ctx, filename, NULL, NULL); /* select the video stream */ vst_idx = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1, -1, &dec, 0); dec_ctx = fmt_ctx->streams[vst_idx]->codec; /* init the video decoder */ avcodec_open2(dec_ctx, dec, NULL); } void close_input_file() { for (i = 0; i < fmt_ctx->nb_streams; i++) { AVStream *st = fmt_ctx->streams[i]; avcodec_close(st->codec); } avformat_close_input(&fmt_ctx); } void encode_video() { AVPacket pkt, outpkt; AVFrame *frm; int got_frame, got_output; AVCodec *enc; AVCodecContext *enc_ctx = NULL; /* find the h.264 video encoder */ enc = avcodec_find_encoder(AV_CODEC_ID_H264); enc_ctx = avcodec_alloc_context3(codec); /* put sample parameters */ enc_ctx->bit_rate = 400000; /* resolution must be a multiple of two */ enc_ctx->width = 352; enc_ctx->height = 288; /* frames per second */ enc_ctx->time_base= (AVRational){1,25}; enc_ctx->gop_size = 10; /* emit one intra frame every ten frames */ enc_ctx->max_b_frames=1; enc_ctx->pix_fmt = AV_PIX_FMT_YUV420P; /* init the video encoder */ avcodec_open2(enc_ctx, enc, NULL); frm = av_frame_alloc(); while (1) { av_read_frame(fmt_ctx, &pkt); if (pkt.stream_index == vst_idx) { avcodec_get_frame_defaults(frm); /* decode the frame */ avcodec_decode_video2(dec_ctx, frm, &got_frame, &pkt); if (got_frame) { av_init_packet(&outpkt); outpkt.data = NULL; outpkt.size = 0; /* encode the frame */ avcodec_encode_video2(c, &outpkt, frm, &got_output); if (got_output) { /* write or send the frame */ av_free_packet(&outpkt); } } } av_free_packet(&pkt); } av_init_packet(&outpkt); outpkt.data = NULL; outpkt.size = 0; /* get the delayed frames */ got_output = 1; while (got_output) { /* encode the frame */ avcodec_encode_video2(c, &outpkt, frm, &got_output); if (got_output) { /* write or send the frame */ av_free_packet(&outpkt); } } av_frame_free(&frm); }
예제 코드에서 추가로 사용한 자료형과 함수
'Streaming Media > Media Tools' 카테고리의 다른 글
VLC 미디어 재생의 데이타 흐름 다이어그램 (0) 2016.12.16 FFmpeg으로 재생하는 프로그램 만들기 (1) 2013.06.20 FFmpeg으로 미디어 스트림 열기 (0) 2013.06.19 FFmpeg 데이타 흐름 다이어그램 (0) 2013.06.17 FFmpeg 기본 자료형 - AVFifoBuffer (0) 2013.06.10 댓글