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 beforets_b
- 1 if
ts_a
is afterts_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);
作用: 把错误返回值解析为字符串