FFmpeg基础知识之转封装api接口

        FFmpeg在音视频开发中占据着至关重要的作用,现在ffmpeg的入门资料,大家大都是看雷神的博客,雷神的博客给大家指引了方向,但是对于我这种新手来说,雷神的博客仍然比较晦涩难懂,其中主要原因还是对于ffmpeg的API没有详细的介绍,因此我打算从ffmpeg提供的例子出发,给大家简单介绍ffmpeg的API使用说明。

转封装


1、pkt = av_packet_alloc(); // 申请封装包的内存
2、ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)  打开输入文件,并创建formatContext结构,(这个结构相当于我们实际操作的结构体,什么数据都可以丢进去)
3、ret = avformat_find_stream_info(ifmt_ctx, 0)  从输入formatContext结构中遍历每一个音视频流 。得到音视频流信息,常见于输入文件
4、 avformat_alloc_output_context2 打开输出文件上下文
5、av_dump_format(ifmt_ctx, 0, in_filename, 0); 打印输入formatContext的格式相关信息
5、stream_mapping = av_calloc(stream_mapping_size, sizeof(*stream_mapping));; 申请一个数组存储流(stream)有无数据标志位
6、avformat_new_stream(ofmt_ctx, NULL)  在输出format上下文中创建新的流结构,常见于输出文件
7、ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);  把音视频流参数信息从输入流拷贝到输出才创建的流结构中
8、 av_dump_format(ofmt_ctx, 0, out_filename, 1);打印输出formatContext的格式相关信息
8、ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);  创建并初始化aviocontext,并且挂载到输出文件formatContext的pd上,向输出文件写入数据都是通过aviocontext完成的
9、ret = avformat_write_header(ofmt_ctx, NULL); 尝试写入输出文件的封装格式头部信息(通过avio_open结点去写)
10、 av_read_frame(ifmt_ctx, pkt);  从输入文件读取AVPacket音视频包
11、av_packet_rescale_ts(pkt, in_stream->time_base, out_stream->time_base); 把pak里面的输入时间基转换为输出时间基
11、ret = av_interleaved_write_frame(ofmt_ctx, pkt);   将转换后的pkt包写入到输出formatContext中
12、av_write_trailer  关闭输出文件前,做写封装首尾工作
13、avformat_free_context 函数关闭输出文件,放因操作输出文件封装格式申请的资源
14、avformat_close_input 关闭输入文件并释放相关的资源

总结


    从上面的转封装流程我们可以看到,所谓的转封装其实就是通过avformat_find_stream_info遍历音视频流,得到音视频流信息,然后通过av_read_frame读取pkt包,再写入到转换好时间基,头文件相关信息的输出文件中,由于转封装不涉及到编解码,所以需要的API要少很多。

你可能感兴趣的:(ffmpeg,音视频,ffmpeg)