【FFMpeg SDK使用】API汇总解析

avformat_alloc_output_context2

作用: 根据输出文件的格式获取AVFormatContext结构,获取AVFormatContext结构,封装的时候使用,由于输出文件是不存在的,所以需要使用这个接口,正常输出文件存在时使用avformat_open_input

int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat, const char *format_name, const char *filename);

参数:

  • ctx:输出到AVFormatContext结构的指针,如果函数失败则返回给该指针为NULL;
  • oformat:指定输出的AVOutputFormat类型,如果设为NULL则使用format_name和filename生成;
  • format_name:输出格式的名称,如果设为NULL则使用filename默认格式;
  • filename:目标文件名,如果不使用,可以设为NULL;
    注意: 2、3参数都设置为NULL,则使用默认

avformat_new_stream

作用: 根据AVCodec new一个AVStream,封装时使用

AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);

参数:

  • s:AVFormatContext结构,表示要封装生成的视频文件;
  • c:上一步根据codec_id产生的编码器指针;

返回值: 指向生成的stream对象的指针;如果失败则返回NULL指针,并且会根据AVCodec自动分配AVCodecContext
注: avformat_new_stream调用之后s->nb_streams就会增加1,可以用此值表示唯一的流id

avio_open

作用: 打开封装格式的文件

int avio_open(AVIOContext **s, const char *url, int flags);

参数:

  • AVIOContext **s
  • url:文件名
  • flags:读写AVIO_FLAG_WRITE
    例:
ret = avio_open(&oc->pb, io.output_file_name, AVIO_FLAG_WRITE);

av_compare_ts

作用: 比较两个流时间戳进度,用于音视频同步

int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);

参数:

  • 1、3是时间戳

返回值:

  • -1 if ts_a is before ts_b
  • 1 if ts_a is after ts_b
  • 0 if they represent the same position

例子:
前面的与后面比,后面是1s一帧,并且第10帧,前面是1s 25fps,目前是第0帧

AVRational r1 = { 1, 25 };
AVRational r = { 1, 1 };
int64_t next_pts = 0;
if (av_compare_ts(next_pts, r1, 10, r) >= 0)
{
	return NULL;
}

avcodec_copy_context

作用: AVCodecContext的拷贝

int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);

av_read_frame

作用: 从封装格式的文件中读取一个包,包中会返回当前包是属于哪个流的(音频还是视频的序号pkt.stream_index)

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

av_interleaved_write_frame

作用: 将包写入到某个封装文件中

int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);

av_parse_video_size

作用: 将1920 * 1080转化为分别的宽和高
例:

av_parse_video_size(&dstWidth, &dstHeight, files.outputFrameSize)

av_image_alloc

作用: 分配一个buffer内存,保存YUV数据,注意和av_frame_alloc的区别
例:

uint8_t *src_data[4];
int src_linesize[4];
if ((ret = av_image_alloc(src_data, src_linesize, srcWidth, srcHeight, src_pix_fmt, 32)) < 0)
{
	printf("Error: allocating src image failed.\n");
	goto end;
}

av_frame_alloc、av_image_fill_arrays

作用: 申请AVFrame结构体,av_image_fill_arrays根据指定的图像设置数据指针和行大小
例:

*frameIn = av_frame_alloc();  
*frame_buffer_in = (unsigned char *)av_malloc(av_image_get_buffer_size(AV_PIX_FMT_YUV420P, frameWidth,frameHeight,1));  
av_image_fill_arrays((*frameIn)->data, (*frameIn)->linesize,*frame_buffer_in, AV_PIX_FMT_YUV420P,frameWidth,frameHeight,1);

sws_scale

作用: 对数据进行缩放
例:

sws_scale(sws_ctx, (const uint8_t * const*)src_data, src_linesize, 0, srcHeight, dst_data, dst_linesize);

av_strerror

int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
作用: 把错误返回值解析为字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值