1.简介
在日常处理视频文件时常常会用到视频片段的截取功能,FFmpeg支持该功能,拥有视频的起始时间定位以及截取视频长度的接口av_seek_frame。
2.流程
2.1 在使用FFmpeg API之前,需要先注册API,然后才能使用API。当然,新版本的库不需要再调用下面的方法。
av_register_all()
2.2 构建输入AVFormatContext
声明输入的封装结构体,通过输入文件或者流地址作为封装结构的句柄。
AVFormatContext* ifmt_ctx = NULL;
const char* inputUrl = "test.mp4";
///打开输入的流
int ret = avformat_open_input(&ifmt_ctx, inputUrl, NULL, NULL);
if (ret != 0)
{
printf("Couldn't open input stream.\n");
return -1;
}
2.3 查找音视频流信息,通过下面的接口与AVFormatContext中建立输入文件对应的流信息。
//查找;
if (avformat_find_stream_info(inputFmtCtx, NULL) < 0)
{
printf("Couldn't find stream information.\n");
return -1;
}
2.4构建输出AVFormatContext
//输出的文件
AVOutputFormat *ofmt = NULL;
AVFormatContext *ofmt_ctx = NULL;
const char* out_filename = "out.flv";
avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, out_filename);
if (!ofmt_ctx)
{
return -1;
}
2.5申请输出的stream信息。
AVStream* out_stream = NULL;
//创建一个新的流
out_stream = avformat_new_stream(ofmt_ctx, NULL);
if (!out_stream)
{
return -1;
}
2.6信息的复制,输出的stream信息建立完成之后,需要从输入的stream中将信息复制到输出的stream中。
//输入的流 视频、音频、字幕等
AVStream* in_stream = ifmt_ctx->streams[i];
AVCodecParameters* in_codecpar = in_stream->codecpar;
//复制输入的流信息到输出流