您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

超详细ffmpeg.c框架分析

时间:2020-09-24 09:13:13  来源:  作者:

超详细ffmpeg.c框架分析

1.环境搭建和整体工程说明

命令行输入:-i 3.flv -vcodec copy 2_audio.mp4

超详细ffmpeg.c框架分析

 

转码的CPU占有率。

超详细ffmpeg.c框架分析

 

需要在这个目录下,拷贝正确的SDL2.dll

超详细ffmpeg.c框架分析

 

转码过程:

超详细ffmpeg.c框架分析

 

转码成功后,MP4的大小要比3.flv的大一些。

超详细ffmpeg.c框架分析

 

使用Mediainfo查看转码前后的对比。

超详细ffmpeg.c框架分析

 

接下来,就详细聊聊ffmpeg.c。

ffmpeg.c本质是是基于FFmpeg库开发的多媒体⽂件转换器(multimedia converter)。

ffmpeg.c的作⽤如下:

(1)转码:⽐如转成MP3/AAC/H264/H265等等。

(2)压缩:⽐如将PCM进⾏⾳频编码,YUV进⾏视频编码。

(3)提取:⽐如提取⾳频⽂件,保存为AAC,提前视频⽂件,保存为H264。

(4)截取:⽐如从第5秒开始截取10秒的视频。

(5)拼接:⽐如将多个⽂件视频拼接⻓⼀个⽂件视频。

(6)合并:⽐如实现九宫格输出。

(7)录屏:ffmpeg可以⽤来录屏,但效率不⾼。

 

市⾯是的格式⼯⼚⼯具,⼤部分都是基于ffmpeg.c⼆次开发,⽐如:

迅捷视频转换器

爱剪辑

 

2.ffmpeg框架分析

ffmpeg对应的⽂件

ffmpeg程序涉及的主要⽂件:

(1)cmdutils.c:解析命令相关的⼯具函数。

(2)ffmpeg_opt.c:负责解析命令⾏输⼊的参数,以-vcodec copy的处理为例,对应了opt_video_codec函数(key-value的结构,- 接下来的字符是代表key的开始,key后⾯紧跟着value)。重点关注的是解析出来的信息存储在 OptionsContext, ⽐如opt_video_codec函数。如下图,是解析命令的函数调用栈。

超详细ffmpeg.c框架分析

 

然后在处理的时候 open_output_file -> choose_encoder -> new_video_stream ->new_output_stream -> choose_encoder的时候可以获取到对应的编码器到底应该使⽤什么。

超详细ffmpeg.c框架分析

 

ffmpeg.c:多媒体⽂件转换器的主体。

ffmpeg_cuvid.c:CUDA硬件相关的加速。

ffmpeg_filter.c:filter相关。

ffmpeg_hw.c:硬件加速相关。

 

3.ffmpeg程序框架流程

(1)解析命令⾏

ffmpeg_parse_options 解析命令⾏的函数。对应的命令 const OptionDef options,例如:

{ "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT, { .func_arg =opt_video_codec },

{ "codec", HAS_ARG | OPT_STRING | OPT_SPEC |OPT_INPUT | OPT_OUTPUT, { .off =OFFSET(codec_names) },"codec name", "codec" },

(2)打开输⼊⽂件 open_input_file

avformat_open_input。

分析码流 avformat_find_stream_info。

查找对应的编码器。

(3)打开输出⽂件 open_output_file

avformat_alloc_output_context2 先建⼀个输出⽂件。

avformat_new_stream 新建⼀个steam。

(4)读取输⼊⽂件

av_read_frame 读取输⼊⽂件。

(5)解码编码

解码:avcodec_send_packet和avcodec_receive_frame。

编码:avcodec_send_frame和avcodec_receive_packet。

(6)写⼊输出⽂件

avformat_write_header写⼊头部。

av_interleaved_write_frame 交替写⼊packet。

av_write_trailer 写⼊尾部。

 

4.框图分析

接下来主要分析transcode()。

超详细ffmpeg.c框架分析

 

transcode_init():转码的初始化⼯作。

check_keyboard_interaction():检测键盘操作。⽐如转码的过程中按下“q”键之后,会退出转码,该函数内还有⼀些其他的按键处理,具体看函数实现也是挺简单的。

transcode_step():进⾏转码

print_report():打印转码信息,输出到屏幕上,如下信息:

超详细ffmpeg.c框架分析

 

flush_encoder():输出编码器中剩余的帧。

当中check_keyboard_interaction(),transcode_step(),print_report()三个函数位于⼀个循环之中会不断地运⾏

transcode_init()调⽤了以下⼏个重要的函数:

(1)init_input_stream():当中调⽤了avcodec_open2()打开编码器。

(2)init_output_stream()。

(3)av_dump_format()在屏幕上打印输出格式信息。注意是输出格式的信息。输⼊格式的信息的打印是在parse_options()函数运⾏过程中调⽤opt_input_file()的时候打印到屏幕上。

(4)avformat_write_header():写输出⽂件的⽂件头。

 

transcode_step()调⽤了例如以下函数:

(1)process_input():完成解码⼯作。

(2)transcode_from_filter():未分析。

(3)reap_filters():完成编码⼯作。

(4)process_input()流程图如下所示:

超详细ffmpeg.c框架分析

 

get_input_packet():获取⼀帧压缩编码数据,即⼀个AVPacket。当中调⽤了av_read_frame()。

output_packet():解码压缩编码的数据并将之送⾄AVFilterContext。

output_packet()调⽤了例如以下函数:

decode_video():解码⼀帧视频(⼀个AVPacket)。

decode_audio():解码⾳频(并不⼀定是⼀帧,是⼀个AVPacket)。

do_streamcopy():假设不需要⼜⼀次编码的话,则调⽤此函数,⼀般⽤于封装格式之间的转换。速度⽐转码快⾮常多

decode_video()调⽤了例如以下函数:

avcodec_decode_video2():解码⼀帧视频。

rate_emu_sleep():要求依照帧率处理数据的时候调⽤。能够避免FFmpeg处理速度过快。经常使⽤于⽹络实时流的处理(RTP/RTMP流的推送)。

configure_filtergraph():设置AVFilterGraph。

av_buffersrc_add_frame():将解码后的数据(⼀个AVFrame)送⾄AVFilterContext。

decode_audio()调⽤的函数和decode_video()基本⼀样。唯⼀的不同在于其解码⾳频的函数是avcodec_decode_audio4()。

reap_filters():主要完成了编码的工作。

其函数调⽤结构例如以下图:

超详细ffmpeg.c框架分析

 

reap_filters()调⽤了例如以下函数:

av_buffersink_get_buffer_ref():从AVFilterContext中取出⼀帧解码后的数据(结构为AVFilterBufferRef。能够转换为AVFrame)。

avfilter_copy_buf_props():AVFilterBufferRef转换为AVFrame。

do_audio_out():编码⾳频。

do_video_out():编码视频。do_video_out()调⽤了例如以下函数:

avcodec_encode_video2():编码⼀帧视频。

write_frame():写⼊编码后的视频压缩数据。

write_frame()调⽤了例如以下函数:

av_bitstream_filter_filter():使⽤AVBitStreamFilter的时候。会调⽤此函数进⾏处理。

av_interleaved_write_frame():写⼊压缩编码数据。

avfilter_unref_buffer():释放资源。

do_audio_out()调⽤的函数与do_video_out()基本上⼀样。唯⼀的不同在于视频编码函数。

avcodec_encode_video2()变成了⾳频编码函数avcodec_encode_audio2()。

 

exit_program()主要完成了清理⼯作。调⽤关系例如以下图:

超详细ffmpeg.c框架分析

 

调⽤了如以下函数:

avfilter_graph_free():释放AVFilterGraph。

avformat_free_context():释放输出⽂件的AVFormatContext。

av_bitstream_filter_close():关闭AVBitStreamFilter。

avformat_close_input():关闭输⼊⽂件。

 

4.附加部分

(1)解析命令行ffmpeg_parse_options。

(2)打开输入文件。

(3)打开输出文件。

(4)读取输入文件,av_read_frame。函数调用栈如下:

超详细ffmpeg.c框架分析

 

(5)编解码

解码:avcodec_send_packet。

编码:avcode_send_frame。

解码video:

超详细ffmpeg.c框架分析

 


超详细ffmpeg.c框架分析

 

解码audio:

超详细ffmpeg.c框架分析

 

(6)将packet写入输出文件

avformat_write_header:写入头部。

av_interleaved_write_frame:写入packet。

av_write_trailer:写入尾部。

超详细ffmpeg.c框架分析

 

本篇文章就分享到这里,欢迎关注,点赞,转发,收藏。



Tags:ffmpeg.c框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1.环境搭建和整体工程说明命令行输入:-i 3.flv -vcodec copy 2_audio.mp4 转码的CPU占有率。 需要在这个目录下,拷贝正确的SDL2.dll 转码过程: 转码成功后,MP4的大小要比3.fl...【详细内容】
2020-09-24  Tags: ffmpeg.c框架  点击:(122)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条