FFmpeg源码分析与实践
文章平均质量分 77
徐福记456
生命不息,奋斗不止,热爱音视频,努力维护开源社区,记录自己成长之路。
展开
-
FFmpeg源码分析:avcodec_send_frame()和avcodec_receive_packet()音视频编码
FFmpeg在libavcodec模块,旧版本提供avcodec_encode_video2()作为视频编码函数,avcodec_encode_audio2()作为音频编码函数。在FFmpeg 3.1版本新增avcodec_send_frame()与avcodec_receive_packet()作为音视频编码函数。后来,在3.4版本把avcodec_encode_video2()和avcodec_encode_audio2()标记为过时API。原创 2022-03-05 23:57:44 · 7283 阅读 · 0 评论 -
FFmpeg之FFprobe检测多媒体格式
FFmpeg里面有一个模块FFprobe(https://ffmpeg.org/ffprobe.html)专门用来检测多媒体格式数据,它的作用类似Android中的MediaMetadataRetriever。FFprobe支持检测format、streams、frames,用法与FFmpeg类似,我们可以单独使用,也可以结合在一起使用,下面举例说明一下:1、format仅是显示forma...原创 2020-01-12 23:43:50 · 44168 阅读 · 0 评论 -
Android端使用FFmpeg进行视频画面拼接
今天看到抖音上,有人发布水平拼接的短视频。这创意不错,本身是两个不同的短视频,通过视频拼接技术把两短视频拼在一起。除了视频进行水平拼接,音频也混合在一起。前期还需要对那两视频进行预处理:包括时长、分辨率、像素格式等。既然抖音可以做出这样效果,那我们也应该可以做。下面是抖音的视频拼接截图: 我第一时间想到的是FFmpeg,通过查阅FFmpeg文档,发现可以采用overl...原创 2018-06-18 22:52:47 · 44973 阅读 · 37 评论 -
从FFmpeg源码去解决IJKPlayer直播花屏问题
IJKPlayer是一个非常优秀的播放器,支持rtmp、rtsp、http等协议直播,也支持Android、iOS跨平台使用。我在使用IJKPlayer做rtsp直播时,发现分辨率在达到1080P甚至是4K时,由于数据量比较大,有时出现花屏,影响用户体验。那么,我们需要做的是避开花屏,增大拉流缓冲区防止溢出、丢掉不完整帧、不渲染解码出错帧。一、增大拉流缓冲区我们默认是使用udp去拉流,在u...原创 2018-12-21 01:58:21 · 48650 阅读 · 28 评论 -
Android端使用FFmpeg的AVFilter滤镜
现在各种直播平台如雨后春笋般出现,游戏、女主播等直播特受欢迎。开发人员往往会在推流端加上各种滤镜特效,不仅限于美颜美肤。本篇文章探讨使用FFmpeg的AVFilter实现滤镜,它可以实现多种花式特效。更多信息请查看FFmpeg官网文档:https://ffmpeg.org/ffmpeg-filters.html。 AVFilter基本使用流程是:初始化滤波器、传入待滤波的视频...原创 2018-06-07 00:26:44 · 43439 阅读 · 4 评论 -
ijkplayer基于rtsp直播延时的深度优化
现在ijkPlayer是许多播放器、直播平台的首选,相信很多开发者都接触过ijkPlayer,无论是Android工程师还是iOS工程师。我曾经在Github上的ijkPlayer开源项目上提问过:视频流为1080P、30fps,如何优化RTSP直播的延时为大约100ms呢?发现大家对RTSP直播延时优化非常感兴趣,纷纷提问或者给出自己的观点。本文主要是总结,也是与大家探讨RTSP直播的延时优化。原创 2018-12-26 02:09:22 · 62950 阅读 · 74 评论 -
常见FFmpeg命令行全面分析
FFmpeg多媒体库支持的命令行调用分为三个模块:ffmpeg、ffprobe、ffplay。其中ffmpeg命令行常用于音视频剪切、转码、滤镜、拼接、混音、截图等;ffprobe用于检测多媒体流格式;ffplay用于播放视频。详情可查阅FFmpeg官方文档:https://ffmpeg.org/ffmpeg-all.html。............原创 2021-10-23 10:15:08 · 39327 阅读 · 2 评论 -
详细的FFmpeg编译流程与脚本分析
FFmpeg是一个跨平台的多媒体库,也是目前音视频领域应用最广泛的库。它包括llibavcodec、libavformat、libavutil、libavdevice、libavfilter、libswscale、libswresample、libpostproc等模块,其中avcodec用于编解码,avformat用于解封装,avutil是提供工具类,avdevice用于各平台的设备接入原创 2021-09-20 14:20:18 · 37428 阅读 · 4 评论 -
FFmpeg源码分析: AVFrame与AVPacket
FFmpeg有两个存储帧数据的结构体,其中AVPacket是解封装后保存压缩数据包,AVFrame是解码后保存音视频帧。原创 2021-11-26 09:23:31 · 26415 阅读 · 0 评论 -
FFmpeg结构体分析:AVFormatContext连接FFmpeg的桥梁
AVFormatContext对开发者开放,是连接开发者与FFmpeg内部的桥梁。结构体内部包含有AVInputFormat、AVOutputFormat、AVCodec、AVStream、AVDictionary、AVClass等。支持设置自定义IO、监听网络中断状态、设置options、直播秒开调优等。原创 2021-11-23 01:02:33 · 20066 阅读 · 0 评论 -
FFmpeg源码分析:av_read_frame()读取音视频帧
FFmpeg使用av_read_frame()方法读取音频流、视频流、字幕流,得到AVPacket数据包。FFmpeg官方提供的samples有使用示例,或者在ffplay.c代码中:打开文件/网络流后,while循环调用av_read_frame()读取帧数据,也就是解封装demux过程,直到文件末尾EOF。原创 2021-12-01 00:28:06 · 27657 阅读 · 0 评论 -
FFmpeg源码分析: AVStream码流
在AVCodecContext结构体存储有AVStream数组,包含所有视频流、音频流、字幕流的信息。每个码流包含有时间基、时长、索引数组、编解码器参数、dts、元数据。其中,索引数组用于保存每帧数据包offset、size、duration、flag,用于seek定位某个时间戳对应的帧。原创 2021-11-26 00:31:07 · 19962 阅读 · 0 评论 -
FFmpeg源码分析:AVIOContext、IO模型与协议
FFmpeg的IO模型从avio_open()方法开始,核心结构体由AVIOContext和URLProtocol组成。如果需要读取缓冲区buffer数据进行播放,可以通过自定义AVIOContext,并且实现read_packet、write_packet、seek三个方法。如果需要播放加密视频,可以自定义私有协议进行解密,实现URLProtocol的open、read、write、seek、close等方法。原创 2021-11-21 15:14:55 · 36730 阅读 · 0 评论 -
FFmpeg源码分析:avformat_open_input()打开媒体流
avformat_open_input()用于打开输入媒体流与读取头部信息,包括本地文件、网络流、自定义缓冲区。关键流程:打开avio、探测输入流的封装格式。对应的释放方法为avformat_close_input()。原创 2021-11-27 23:47:21 · 36590 阅读 · 0 评论 -
FFmpeg源码分析:avformat_find_stream_info分析码流信息
FFmpeg在调用avformat_open_input()之后,可能码流信息不够完整,可以使用avformat_find_stream_info()获取更多的码流信息。比如获取视频帧率、视频宽高,重新计算最大分析时长,打开解码器解码获取codec数据。原创 2021-11-30 15:10:31 · 36447 阅读 · 3 评论 -
FFmpeg结构体分析: AVCodecContext编解码器上下文
AVCodecContext是FFmpeg编解码上下文的结构体,而AVCodec是编解码参数的结构体。AVCodecContex内部有包含AVCodec、AVCodecInternal等结构体,包含AVCodecID、AVMediaType、AVPixelFormat、AVSampleForat等枚举类型,包含视频的width、height、framerate、bitrate等关键参数,包含音频的samplerate、channels等参数。原创 2021-11-24 01:19:46 · 36291 阅读 · 0 评论 -
FFmpeg源码分析:avcodec_register_all()注册编解码器
FFmpeg的avcodec_register_all()用于注册编解码器,FFmpeg4.0版本以前是调用该方法,运行期把所有编译的编解码器添加到链表。但是FFmpeg4.0版本以后,改为编译期自动生成编解码数组,还有解析器数组。原创 2021-12-05 00:57:10 · 36031 阅读 · 0 评论 -
FFmpeg源码分析:av_register_all()注册封装器与解封装器
FFmpeg中av_register_all()函数用于注册所有muxers、demuxers与protocols。FFmpeg4.0以前是用链表存储muxer/demuxer,FFmpeg4.0以后改为数组存储,并且av_register_all方法已被标记为过时,av_register_input_format和av_register_output_format也被标记为过时。原创 2021-12-04 00:56:23 · 35056 阅读 · 0 评论 -
FFmpeg源码分析:avdevice_register_all()注册设备
FFmpeg的avdevice_register_all()用于注册输入/输出设备,属于libavdevice模块,是libavformat模块的补充,包含muxers与demuxers两部分。设备与平台相关,比如Android、iOS、Windows、Mac、Linux等不同平台提供不同设备。原创 2021-12-04 17:19:25 · 35576 阅读 · 0 评论 -
FFmpeg源码分析:av_parser_parse2()解析数据包
在FFmpeg的libavcodec模块提供解析数据包和编解码功能。其中,av_parser_parse2()函数用来解析数据包,在使用av_read_frame()读取音视频帧时,会调用到该函数进行数据包解析。关于读取音视频帧的源码分析请查看:av_read_frame()文章。原创 2021-12-02 00:42:59 · 35993 阅读 · 0 评论 -
FFmpeg源码分析:avfilter_register_all()注册AVFilter
FFmpeg的avfilter_register_all()用于注册所有AVFilter滤镜,包括音频、视频、音视频。但是FFmpeg4.0以后,注册函数已经被标记为过时,保留该方法是为了兼容以前版本。改为编译期自动生成AVFilter,保存在数组中。原创 2021-12-04 21:33:42 · 33732 阅读 · 0 评论 -
FFmpeg源码分析:avcodec_find_decoder()查找解码器
FFmpeg提供两种方式查找解码器,通过codecId查找avcodec_find_decoder()与通过名字查找avcodec_find_decoder_by_name()。同样地,也提供两种方式查找编码器,通过codecId查找avcodec_find_encoder()与通过名字查找avcodec_find_encoder_by_name()。源码位于libavcodec/allcodecs.c中。原创 2021-12-05 12:17:57 · 42139 阅读 · 2 评论 -
FFmpeg源码分析:图像常用操作
FFmpeg有封装图像的常用操作,位于libavutil/imgutils.c,包括图像拷贝、图像填充、获取图像大小、分配图像、检测图像宽高比是否有效。在视频图像缩放、像素格式转换、视频截图保存等操作,经常需要用到图像操作方法。原创 2021-12-09 09:34:11 · 16569 阅读 · 0 评论 -
FFmpeg源码分析:SwsContext图像转换上下文
FFmpeg的libswscale模块提供图像缩放、图像格式转换功能。其中贯穿整个模块的是SwsContext结构体,方法包括sws_alloc_context分配、sws_init_context初始化、sws_getContext获取上下文、sws_get_cachedContext获取缓存,sws_freeContext释放上下文的方法。原创 2021-12-11 17:10:34 · 33403 阅读 · 0 评论 -
FFmpeg源码分析:sws_scale图像缩放与图像转换
FFmpeg在libswscale模块提供图像缩放与图像转换功能,比如1080P图像缩放为720P,或者YUV422P转换为YUV420P。图像缩放函数有个SwsContext结构体作为上下文,上一篇文章有介绍:SwsContext图像转换上下文。原创 2021-12-11 23:43:38 · 34016 阅读 · 0 评论 -
FFmpeg源码分析:内存管理系统
FFmpeg有专门的内存管理系统,包括:内存分配、内存拷贝、内存释放。其中内存分配包含分配内存与对齐、内存分配与清零、分配指定大小的内存块、重新分配内存块、快速分配内存、分配指定最大值的内存、分配数组内存、快速分配数组内存、重新分配数组内存。原创 2021-12-08 09:27:10 · 16670 阅读 · 0 评论 -
FFmpeg源码分析:log日志系统
FFmpeg的封装专有的log日志系统,支持设置日志等级log level,也支持日志回调log callback,方便开发者调试与排查问题。原创 2021-12-07 00:09:43 · 33440 阅读 · 0 评论 -
FFmpeg源码分析:获取声道布局与声道数
FFmpeg在libavutil模块封装有获取声道布局与声道数的API。声道布局包括:单声道、立体声道、环绕声道、5.0声道、5.1声道、7.0声道、7.1声道等。声道掩码包括:前方左边、前方右边、前方中央、低频、后方左边、后方右边、后方中央、左环绕、右环绕等。声道布局、声道名字和声道位置可以互相转换。原创 2021-12-17 00:05:36 · 22188 阅读 · 0 评论 -
FFmpeg源码分析:音频采样格式相关API
FFmpeg针对音频采样格式的获取与处理,封装有专门工具类。音频采样格式枚举类型与相关API,位于libavutil模块的samplefmt.h,包括获取采样格式名字、获取采样格式类型、获取每个采样所占字节、获取采样数所需缓冲区大小、填充采样数组、分配采样缓冲区、拷贝采样数据、填充采样数据为静音。原创 2021-12-14 00:51:08 · 32646 阅读 · 0 评论 -
FFmpeg源码分析:swr_convert()音频格式转换
FFmpeg在libswresample模块提供提供音频转换函数,以前使用的libavresample模块已经过时。根据官方文档说明:libswresample提供深度优化的音频重采样、声道布局转换与格式转换。音频重采样过程是先建立原始音频信号,然后重新采样。重采样分为上采样和下采样,其中上采样需要插值,下采样需要抽取。从高采样率到低采样率转换是一种有损过程,FFmpeg提供若干选项和算法进行重采样。原创 2021-12-16 01:08:17 · 34541 阅读 · 0 评论 -
FFmpeg源码分析:resample重采样
FFmpeg在libswresample模块提供重采样函数。音频重采样过程是先建立原始音频信号,然后重新采样。重采样分为上采样和下采样,其中上采样需要插值,下采样需要抽取。从高采样率到低采样率转换是一种有损过程,FFmpeg提供若干选项和算法进行重采样。原创 2021-12-19 01:03:55 · 30319 阅读 · 0 评论 -
FFmpeg源码分析:音频滤镜介绍(下)
FFmpeg在libavfilter模块提供音视频滤镜。所有的音频滤镜都注册在libavfilter/allfilters.c。我们也可以使用ffmpeg -filters命令行来查看当前支持的所有滤镜,前面-a代表音频。本篇文章主要介绍音频滤镜,包括:混音、静音填充、哈斯效应、合唱效果、均衡器、iir与fir滤波器、低通滤波器、带通滤波器、高通滤波器、变速变调、音量调节、静音检测。原创 2021-12-21 09:56:27 · 30265 阅读 · 0 评论 -
FFmpeg源码分析:音频滤镜介绍(上)
FFmpeg在libavfilter模块提供音视频滤镜。所有的音频滤镜都注册在libavfilter/allfilters.c。我们也可以使用ffmpeg -filters命令行来查看当前支持的所有滤镜,前面-a代表音频。本篇文章主要介绍音频滤镜,包括:延时、回声、混音、均衡器、限幅器、iir与fir滤波器、低通滤波器、带通滤波器、高通滤波器、变速、变调、静音检测。原创 2021-12-20 00:34:38 · 30648 阅读 · 0 评论 -
FFmpeg源码分析:视频滤镜介绍(上)
FFmpeg在libavfilter模块提供音视频滤镜。所有的视频滤镜都注册在libavfilter/allfilters.c。我们也可以使用ffmpeg -filters命令行来查看当前支持的所有滤镜,前面-v代表视频。本篇文章主要介绍视频滤镜,包括:黑色检测、视频叠加、色彩均衡、去除水印、抗抖动、矩形标注、九宫格。原创 2021-12-22 01:14:04 · 30516 阅读 · 0 评论 -
FFmpeg源码分析:视频滤镜介绍(下)
FFmpeg在libavfilter模块提供音视频滤镜。所有的视频滤镜都注册在libavfilter/allfilters.c。我们也可以使用ffmpeg -filters命令行来查看当前支持的所有滤镜,前面-v代表视频。本篇文章主要介绍视频滤镜,包括:绘制文字、边缘检测、淡入淡出、高斯模糊、左右镜像、图层叠加、视频旋转。原创 2021-12-23 00:55:34 · 30375 阅读 · 0 评论 -
FFmpeg源码分析:AVFilterGraph与AVFilter
FFmpeg在libavfilter模块提供简单与复杂的音视频滤镜,所有滤波器由AVFilterGraph滤波器图表连接起来。简单滤镜为一对一输出,复杂滤镜为多对一输出。重要的结构体包括:AVFilterGraph、AVFilterLink、AVFilterContext、AVFilter。支持在滤波器图表指定位置插入AVFilter滤波器,然后由AVFilterLink把滤波器连接起来。原创 2021-12-31 23:49:10 · 21928 阅读 · 0 评论 -
FFmpeg源码分析:视频滤镜之deshake抗抖动
FFmpeg在avfilter模块提供各种音视频滤镜。本篇文章主要介绍deshake抗抖动,又称为去抖动,用于修复水平和/或垂直移动中的小变化。运用SAD块匹配运动补偿来消除垂直或水平方向漂移带来的微小偏差。此滤波器有助于消除手持相机、在车辆上移动时产生的相机抖动。原创 2021-12-26 22:15:25 · 28604 阅读 · 0 评论 -
FFmpeg源码分析:连接AVFilter的桥梁buffersrc与buffersink
FFmpeg在libavfilter模块提供音视频滤镜,而buffersrc与buffersink是连接AVFilter滤镜的桥梁。其中buffersrc是输入缓冲区,buffersink是输出缓冲区。通过调用av_buffersrc_add_frame_flags(),把待滤波的音视频帧推送到输入缓冲区;调用av_buffersink_get_frame_flags()从输出缓冲区取出滤波后的音视频帧。原创 2021-12-28 00:50:42 · 12732 阅读 · 3 评论 -
FFmpeg源码分析:写媒体文件尾av_write_trailer()
FFmpeg在libavformat模块提供音视频的muxer封装与demuxer解封装。其中muxer封装文件包括avformat_write_header()、av_write_frame()和av_write_trailer()。本文主要探讨av_write_trailer函数如何写入文件尾,最终完成多媒体文件的封装。原创 2022-02-13 15:55:38 · 19643 阅读 · 2 评论 -
FFmpeg源码分析:写媒体文件头avformat_write_header()
FFmpeg在libavformat模块提供mux封装视频的API,包括avformat_write_header()写文件头、av_write_frame()写音视频帧、av_write_trailer()写文件尾。本文主要介绍写文件头的方法avformat_write_header()。通过分析源码,与大家一起探讨FFmpeg是如何封装视频文件的。原创 2022-02-08 00:19:42 · 23519 阅读 · 0 评论