在ffmpeg中增加libavformat库所支持格式的媒体文件

本文介绍了如何使用FFmpeg库在libavformat中添加媒体文件格式支持,包括初始化、格式猜测、分配上下文、增加视频流、设置参数、编码和输出流程,以及解码视频帧的过程。详细讲解了每个步骤的关键函数和操作,是FFmpeg开发的重要参考。
摘要由CSDN通过智能技术生成

如何输出一个libavformat库所支持格式的媒体文件,具体步骤如下:


(1)av_register_all(),初始化 libavcodec库,并注册所有的编解码器和格式。
(2)guess_format(),根据文件名来获取输出文件格式,默认为mpeg。
(3)av_alloc_format_context() 分配输出媒体内容。
  ov->oformat = fmt;
  snprintf( oc->filename, sizeof(oc->filename), “%s”, filename );
(4)add_video_stream()使用默认格式的编解码器来增加一个视频流,并初始化编解码器。
  (4.1)av_new_stream()增加一个新的流到一个媒体文件。
  (4.2)初始化编解码器:
    c = st->codec;
    c->codec_id = codec_id;
    c->codec_type = CODEC_TYPE_VIDEO;
    c->bit_rate = 400000;
    c->width = 352;
    c->height = 288;
    c->time_base.den = STREAM_FRAME_RATE; //每秒25副图像
    c->time_base.num = 1;
    c->gop_size = 12;
    c->pix_fmt = STREAM_PIX_FMT; //默认格式为PIX_FMT_YUV420P
    …… ……
(5)av_set_parameters()设置输出参数,即使没有参数,该函数也必须被调用。
(6)dump_format()输出格式信息,用于调试。
(7)open_video()打开视频编解码器并分配必要的编码缓存。
  (7.1)avcodec_find_encoder()寻找c->codec_id指定的视频编码器。
  (7.2)avcodec_open()打开编码器。
  (7.3)分配视频输出缓存:
    video_outbuf_size = 200000;
    video_outbuf = av_malloc( video_outbuf_size );
  (7.4)picture = alloc_picture()分配原始图像。
    (7.4.1)avcodec_alloc_frame()分配一个AVFrame并设置默认值。
    (7.4.2)size = avpicture_get_size()计算对于给定的图片格式以及宽和高,所需占用多少内存。
    (7.4.3)picture_buf = av_malloc( size )分配所需内存。
    (7.4.4)avpicture_fill()填充AVPicture的域。
  (7.5)可选。如果输出格式不是YUV420P,那么临时的YUV420P格式的图像也是需要的,由此再转换为我们所需的格式,因此需要为临时的YUV420P图像分配缓存:
  tmp_picture = alloc_picture()
说明:tmp_picture,picture,video_outbuf。如果输出格式为YUV420P,则直接通过avcodec_encode_video()函数将picture缓存中的原始图像编码保存到video_outbuf缓存中;如果输出格式不是YUV420P,则需要先通过sws_scale()函数,将YUV420P格式转换为目标格式,此时tmp_picture缓存存放的是YUV420P格式的图像,而picture缓存为转换为目标格式后保存的图像,进而再将 picture缓存中的图像编码保存到video_outbuf缓存中。
(8)url_fopen()打开输出文件,如果需要的话。
(9)av_write_header()写流动头部。
(10)LOOP循环{
    计算当前视频时间video_pts
    是否超时退出循环?
    write_video_frame()视频编码
  }
  (10.1)write_video_frame()
    如果图片不是YUV420P,则需要用 sws_scale()函数先进行格式转换。
    若需要原始图像:
      av_init_packet()初始化一个包的选项域。
      av_write_frame()向输出媒体文件写一个包,该包会包含一个视频帧。
    若需要编码图像:
      avcodec_encode_video() 编码一视频帧。
      av_init_packet()
      av_write_frame()
(11)close_video()关闭每个编解码器。
(12)av_write_trailer()写流的尾部。
(13)释放资源
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值