FFmpeg 音视频截取

本文详细介绍了如何使用FFmpeg API进行音视频截取,从注册API到构建输入输出AVFormatContext,再到av_seek_frame的时间戳定位和数据包读取写入,最后收尾关闭资源。关键步骤包括查找流信息、设置输出stream并复制输入stream信息,以及选择合适的av_seek_frame策略。适合FFmpeg初学者和进阶开发者参考。
摘要由CSDN通过智能技术生成

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;
 
        //复制输入的流信息到输出流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值