![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ffmpeg笔记
文章平均质量分 58
一叶知秋@qqy
这个作者很懒,什么都没留下…
展开
-
FFmpeg多媒体文件处理(ffmpeg打印音视频Meta信息)
打印音/视频信息avdevice_register_all()avformat_open_input()/avformat_close_inputav_dump_format()实战int main(int argc, const char * argv[]) { int ret = 0; AVFormatContext *fmt_ctx = NULL; //创建AVFormatContext格式上下文指针 av_log_set_level(AV_LOG_I原创 2021-07-31 21:50:40 · 449 阅读 · 0 评论 -
FFmpeg多媒体文件处理(ffmpeg处理流数据的基本概念)
多媒体文件概念多媒体文件其实是个容器在容器里有很多流(Stream/Track)每种流是由不同的编码器编码的从流里读出的数据称为包在一个包中含着一个或多个帧几个重要结构体AVFormatContext 格式上下文AVStream 流和轨的概念AVPacket 一个个包ffmpeg在操作流数据的基本步骤...原创 2021-07-31 20:57:26 · 325 阅读 · 0 评论 -
FFmpeg多媒体文件处理(ffmpeg操作目录及list的实现)
操作目录重要函数avio_open_dir() 打开目录avio_read_dir() 读取目录中每一项文件的信息,包括文件的大小等avio_close_dir() 关闭目录,释放资源操作目录重要结构体AVIODirContext 操作目录的上下文AVIODirEntry 目录项,用于存放文件名,文件大小等信息实战 简单的ls命令在linux、mac等系统下,终端输入ls就可以看见当前目录下有哪些文件,他们的属性是什么使用ls -alt,可以查看更详细的信息#include &原创 2021-07-29 23:20:29 · 704 阅读 · 0 评论 -
FFMPEG多媒体文件处理(ffmpeg文件的删除与重命名)
文件的删除与重命名avpriv_io_delete() 删除ffmpeg文件avpriv_io_move() 重命名ffmpeg文件所有对文件操作,对目录操作都是在libavformat子模块下,即要引入这个头文件include <libavformat/avformat.h>删除文件例子:ret = avpriv_io_delete("./mytestfile.txt"),ret小于0失败在终端寻找库的位置,使用pkg-config --libs libavformat原创 2021-07-29 22:44:01 · 944 阅读 · 0 评论 -
FFmpeg多媒体文件处理(FFMPEG日志系统)
FFMPEG日志系统include <libavutil/log.h> 引用ffmpeg头文件av_log_set_level(AV_LOG_DEBUG) 设置ffmpeg日志级别,debug级别是ffmpeg最低的级别av_log(NULL, AV_LOG_INFO, “…%S\N”, op) 打印日志,第一个参数一般设置为NULL,先忽略,后面说,第二个参数是日志级别,第三个是可变参数,用法与printf是类似的。常用日志级别AV_LOG_ERRORAV_LOG_WARNI原创 2021-07-29 22:17:28 · 260 阅读 · 0 评论 -
FFmpeg多媒体文件处理(ffmpeg初级开发介绍)
初级开发内容这个系列开始对ffmpeg进行学习,主要涉及到以下几个方面:FFmpeg日志的使用及目录操作介绍FFmpeg的基本概念及常用结构体对复用/解复用及流操作的各种实战FFmpeg代码结构库名含义libavcodec提供了一系列编码器的实现libavformat实现在流协议,容器格式及基本IO访问libavutl包括了hash器,解码器和各种工具函数libavfilter提供了各种音视频过滤器libavdevice提供了访问捕获设备原创 2021-07-28 22:59:47 · 153 阅读 · 0 评论 -
RTMP传输(RTMP消息)
RTMP消息格式RTMP是由RTMP Header 和RTMP Body组成的。RTMP Header 包括 Basic Header, Message Header, Extened TimeStampBasic HeaderBasic Header的第一个字节分为两部分fmt(占2位)和后面的数字x(占6位)如果x是0 就在增加一个字节CSID,标识的范围是2^6 -------2^6 + 2^8如果x是1 就在增加3个字节CSID1 CSID2 CSID3,标识的范围是 2^6 + 2^原创 2021-07-26 23:21:13 · 417 阅读 · 0 评论 -
RTMP传输(创建RTMP流)
协议中RTMP流的创建真实创建RTMP流真实推RTMP流真实播RTMP流原创 2021-07-26 22:39:29 · 237 阅读 · 0 评论 -
RTMP传输(RTMP连接的建立)
RTMP协议应用范围:娱乐直播的传输和点播协议HLS 是由苹果公司推出的,用来替换RTMP协议。但由于前期各个厂家的投入。替换的可能性微乎其微。RTMP相对于HLS 的效率和实时性上要高很多。RTMP依赖于TCP协议。RTMP是在TCP之上的,client和server的connection也是通过三次握手。管道中的虚线表示建立链接后的stream。橙色的流指的是客户端发布节目到服务端,服务端接收到流时会直接接收,有客户订阅时通过蓝色流传出去。RTMP创建流的基本流程socket建立T原创 2021-07-26 22:22:18 · 942 阅读 · 0 评论 -
VSCode+MakeFile+SSH Remote Debug
简介VSCode一直被冠以最强的编辑器,其自身是支持SSH远程连接以及Debug功能,所以在查找了相当多的资料后整理了一下远程调试设备的方法,通过SSH远程连接ubuntu(这里采用的是ubuntu18.04),直接访问编辑linux下的代码,并通过MakeFile文件进行编译,最后实现远程debug代码。值得注意的是,现在仅仅是在linux上验证测试过,未在实体设备上验证,如有需求自行验证,原理相同,理论是可用的。SSH连接如果在之前就使用过ssh,安装openssh-server、wget、cu原创 2021-07-26 15:50:25 · 1866 阅读 · 0 评论 -
视频编码解码(x264参数)
x264参数分类预设值在libx264中有一些参数是预先设置好的,直接使用就可以,不用自己去设置。preset fast/slowpreset的参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢,要根据自己的需求去设置,然后编码器就会根据我们的要求去数据编码结果。例如设置very fast,是最主要用在实时通讯的领域,编码器在编码时追求的原创 2021-07-25 23:11:57 · 2524 阅读 · 0 评论 -
视频编码解码(H264编码实战)
基本步骤打开编码器在打开编码器时,要设置一些参数,例如具体使用的哪一个编码器,编H264时要使用libx264,编H265时要使用libx265。还需要设置GOP,码流大小、分辨率宽和高也需要设置。转换NV12到YUV420PNV12是mac下采集视频的格式,NV12是一个包裹的格式,分两层,第一层是Y,第二层是UVUV进行交替存储,yuv420P是编码器libx264要求的格式。转换时可以采用ffmpeg自身的swscale转换,还可以用google开发的libyuv,还可以自己手工写原创 2021-07-25 21:49:58 · 1707 阅读 · 1 评论 -
FFmpeg获取设备可用视频设备及其支持格式
当使用ffmpeg获取摄像头图像时,涉及到摄像头的设备名,以及设置分辨率等等,虽然可以根据经验去做大概的猜测,但是对于我这样子的小白来说就没有什么经验了,所以还是查询一下比较稳妥。使用如下的命令去查询都有那些设备:ffmpeg -f avfoundation -list_devices true -i ""返回如下界面:在AVFoundation video devices中有两个设备名。一个是[0],指的是摄像头的采集界面,另一个是[1],指的是屏幕的捕捉界面。还有就是下面的AVFound原创 2021-07-24 15:50:00 · 2329 阅读 · 0 评论 -
ffmpeg配置H264
H264编码器下载在刚接触ffmpeg时,我一直都是认为所有的资源,所有的编码器都是已经集成在ffmoeg源码包内了,随着使用的需求要求在配置ffmpeg时去打开相应的enable,然后编译源码安装就可以。但是后来随着学习,在使用libx264即H264编码器时,才发现,这些第三方库是需要自己下载安装的,然后ffmpeg才可以去调用这些外部的编码器(动态库的方式)。使用下面的命令实现libx264源码的下载:git clone https://code.videolan.org/videolan/x原创 2021-07-24 15:17:42 · 3465 阅读 · 0 评论 -
视频编解码(h264分析工具)
H264分析工具Elecard Stream Eye这是最常用最有名的一款分析工具,使用它可以分析目前所有的遇见的编码器,例如264、265等等。下载地址:https://www.elecard.com/products/video-analysisCodecVisa同样是一款很有名的工具,也是非常全,包括mac端、linux端、windows端。二者依然是Elecard Stream Eye更为好用,但是价格也是更为贵一些。雷神开发的工具雷神开发的工具是基于ffmpeg,像运动原创 2021-07-18 21:53:21 · 12150 阅读 · 3 评论 -
视频编码解码(PPS与Slice Header)
PPS重要参数entropy_coding_mode_flag -> 熵编码 1表示使用CABAC,0表示CALVCnum_slice_groups_minus1 -> 分片数量weighted_pred_flag -> 在P/SP Slice中加权预测的方法weighted_bipred_idc -> 在B Slice中加权预测的方法pic_init_qp_minus26/pic_init_qs_minus26 -> 初始化量化参数,实际参数在Slice Hea原创 2021-07-18 21:00:29 · 351 阅读 · 0 评论 -
视频编解码(SPS重要参数)
SPS重要参数pic_width_in_minus1 - > 图像宽度包含的宏块个数-1第一行中mbs部分指的是宏块的数量,pic_width_in_minus1即图像宽度包含的宏块个数-1,当计算真实的图像宽度时,需要用pic_width_in_minus1加一,然后整体乘宏块的宽度。pic_heigh_in_minus1 -> 图像高度包含的宏块个数-1pic_heigh_in_minus1也是一样的原理。所以在拿到SPS的这两个属性时,就可以知道图像的宽高各是多少。原创 2021-07-18 17:47:30 · 1329 阅读 · 1 评论 -
视频编码解码(H264中的profile和level)
主要内容即将开始另一系列的笔记,主要是1涉及以下内容SPS/PPS/Slice Header常见的分析工具ffmpeg视频编码Profile与Level这是本节主要涉及的内容H264 Profile对压缩视频特性的描述,profile越高,就说明采用了越高级的压缩特性。在图中可以看得出第一级是以CONSTRAINED BASELINE为核心,发展出来MAIN Profile和BASELINE以及BASELINE的延伸EXTEND Profile。在核心的CONSTRAINED BA原创 2021-07-18 14:01:43 · 5809 阅读 · 0 评论 -
H264编码原理(H264码流)
H264码流H264码流分层NAL层 Network Abstraction Layer,视频数据网络抽象层在H264的整个分层中,第一层称为NAL层,这一层的作用主要是方便我们在网络上传输视频流。因为在网络上传递数据时,经常有丢包、延迟、乱序等现象,而NAL层可以在接受段检测出这种不同的异常情况,然后进行处理,否则仅仅只是以byte数组进行传递时,一旦发生这种异常情况,我们是没有好的解决方法等。例如丢包了,监测到后就可以知道丢了哪个包,可以让对方重新传输一个。如果是乱序了,可以根据NAL原创 2021-07-18 00:43:44 · 619 阅读 · 1 评论 -
H264编码原理(无损压缩)
无损压缩DCT变换经过有损压缩后的数据是分散在二维图标中的各个节点上,数据比较分散时不利于压缩,通过DCT变换,所有的分散数据都被集中在一块,左上角右下角等等。DCT可以将数据由分散变为集中,利于压缩处理数据。在DCT处理前是第一幅图中一个个凸起的方块,可以看出数据量十分分散,但是处理后将所有数据都放在了一个角落,变得聚集,这样非常有益于有损压缩的数据处理。VLC压缩当所有的数据通过DCT变换之后,就可以进行具体的无损压缩了。所谓VLC就是可变长的编码,原理就是将26个字母,常出现的字符原创 2021-07-15 23:51:11 · 2491 阅读 · 0 评论 -
H264编码原理(帧间压缩技术)
帧间压缩技术帧间压缩原理GOP帧间压缩一定是同一个GOP内的相邻帧间进行压缩,两个GOP的帧间差异较大是无法进行帧间压缩的,同一个GOP的帧间压缩是因为每一个GOP内的帧都是强相关的。参考帧所谓的参考帧是后面的帧要参考前面的帧,进行帧间压缩。运动估计(宏块+运动矢量)通过宏块匹配的方式,找到运动矢量,运动矢量就是记录了一个宏块从一个地方运动到另一个地方而且是有方向的。所谓的运动估计就是通过宏块匹配的方法,最终实现找到运动矢量。运动补偿(解码)找到残差值,在解码的时候把残差原创 2021-07-11 18:15:51 · 986 阅读 · 0 评论 -
H264编码原理(帧内压缩技术)
帧内压缩的理论相邻像素差别不大,所以可以进行宏块预测人对亮度的敏感度超过色度YUV很容易将亮度与色度进行分开帧内预测如图所示,左侧显示的是H264对于帧内预测提供的9种模式对于每一个宏块的预测都可能是不一样的,根据某一个宏块为基础,在这个宏块下边或者右边的宏块应该是什么样子进行推算时,有9种模式进行选择,具体选则某一种会根据内部算法快速定位应该使用哪一种模式。其选则模式的最基本原则是这9种吗,模式中,哪一种是最接近原来的4x4的宏块就选择哪一种。具体的算法实现可以去翻一翻相原创 2021-07-11 16:54:42 · 1620 阅读 · 1 评论 -
H264编码原理(宏块)
H264压缩技术帧内压缩技术,解决的是空域数据冗余问题假设一张图片是天蓝色背景,整个天蓝色背景就可以用很小的数据量进行存储,背景前的人也会有对应的算法进行处理。帧间压缩技术,解决的是时域数据冗余问题所谓时域就是随之时间的推移,每个时间段都会有一帧数据,一帧一帧的数据间,可以做参考。例如第一帧是I帧,虽然压缩比不是太高,但是第二帧可以根据第一帧做参考,可以获得更高的压缩比。也就是将同一GOP组中的相同数据存储在参考帧内,后面的帧可以用更少的数据记录。整数离散余弦变换(DCT),将空间的原创 2021-07-10 23:02:00 · 1882 阅读 · 0 评论 -
H264编码原理(I帧B帧P帧)
I帧B帧P帧编码帧的分类I帧(intraframe frame),关键帧,采用帧内压缩技术,IDR帧属于I帧。每个GOP组中第一帧肯定是I帧,而且还是一种特殊的I帧,也可以称为IDR帧。一个GOP中可能有很多I帧,但是只有一个IDR帧。如果一组中有很多帧,超过了h264限制,会强制塞一个I帧,防止出现错误时,出现串联,因为后面所有非I帧的解码都要依据I帧中的数据进行解码,都是依赖于I帧的。P帧(forward Predicted frame),向前参考帧。压缩时只参考前面以处理的帧,采用帧原创 2021-07-10 17:20:01 · 3442 阅读 · 2 评论 -
H264编码原理(H264压缩比与GOP)
H264压缩比条件:1、YUV格式为YUV420。 乘1.5倍,rgb是3倍2、分辨率为640x4803、帧率为15原视频未压缩需要6404801.5158 = 55296000(bit),约55M (一秒).H264建议码流为500kps结果: 约1/100码流参考值常用的h264建议码流都并非科学计算得出的,而是各个厂家经过大量实践得出的经验值。常用的查询网址:https://docs.agora.io/cn这是声网总结的经验值,声网在音视频领域是比较权原创 2021-07-07 22:59:43 · 7359 阅读 · 2 评论 -
ffplay实现自定义滤镜小项目
需求最近需要做一个基于ffplay的自定义滤镜显示,需要根据一个二进制bin文件,实际上是要取其中的一段流,根据其中的信息对视频进行涂黑处理,即当取到的流的一位为1时,涂黑视频的一个16*16的像素块。放一个做好后得示例图,方便更直观的理解我的意图。思考因为涉及到这个小工具要播放本地视频,拉流播放等,所以就直接更改ffplay的源码,生成定制版本的ffplay。总体结构图这里放一张雷神画的ffplay总体结构图,雷神文章雷神的文章给了很大的帮助,因为使用的是ffmpeg4.3.1,所以与雷原创 2021-06-29 17:08:15 · 476 阅读 · 0 评论 -
采集设备视频(实战)(待验证)
要修改的点修改设备名称之前音频的采集程序使用的设备名称是音频的名称,现在要改为视频的名称。增加参数确定采集视频的YUV格式、分辨率、帧率等修改文件名及文件数据的大小音频采集例程H文件#ifndef testc_h#define testc_h#include <stdio.h>#include "libavutil/avutil.h"#include "libavdevice/vadevice.h"#include "libavformat/avformat.h"原创 2021-05-30 16:50:18 · 146 阅读 · 0 评论 -
YUV实战
生成YUVffmpeg -i input.mp4-an-c:v rawvideo-pix_fmt yuv 420420p out.yuv-i 参数,代表输入视频-an,a代表audio,n代表no,即没有音频,将音频过滤掉-c:v rawvideo,c:v代表视频的编解码器,使用rawvideo进行处理pix_fmt 指定yuv输出的格式,即yuv420p播放YUVffplay -pix_fmt yuv420p -s 608x398 out.yuv其中ffplay默认的格式原创 2021-05-26 00:14:23 · 347 阅读 · 0 评论 -
YUV常见格式
YUV常见格式YUV4:4:4YUV4:2:2YUV4:2:0YUV4:4:4采样,1280*720,则3*1280*720=2764800像素YUV4:2:2采样,1280*720,则1280*720 + 2*1280*720\2=1843200YUV4:2:0采样,1280*720,则1280*720 + 2*1280\2*720\2=1382400YUV4:2:0是最重要的一种格式,在制作播放器时,必须支持YUV4:2:0的原始数据压缩的MP4文件、FLV文件等多媒体文件YU原创 2021-05-23 17:38:17 · 237 阅读 · 0 评论 -
什么是YUV
什么是YUVYUV(也称YCbCr):Y代表明亮度,UV的作用是描述影响色彩及饱和度主要的采样格式有YUV4:2:0、YUV4:2:2、和YUV4:4:4YUV4:4:4在一些播放器中可能无法播放。YUV图像YUV图像的Y分量YUV中的U分量YUV中的V分量如果使用播放器单独播放U分量和V分量的话,是看不到色彩的,因为手机屏幕和显示器是RGB格式,电视是YUV格式,RGB与YUV的关系RGB用于屏幕图像的展示YUV用于采集与编码RGB转YUVY = 0.299*R原创 2021-05-20 20:04:51 · 8140 阅读 · 0 评论 -
图像的显示
图像的显示图像大小等于显示区域的大小在使用时通常是通过应用程序去显示,即在应用程序内设定显示区域大小,图像大小等于显示区域大小时直接显示图像小于显示区域(拉伸/留白)图像小于显示区域时,可以将图像进行拉伸,符合整个显示区域大小进行显示,但是可能会使图像发生变形。也可以不管显示区域多大,图像就按照原始尺寸进行显示,其余区域留白处理图像大于显示区域(缩小/截断)图像比显示区域大的时候,对图像进行缩小,缩小到显示区域大小进行显示,也可以将四周切掉,只显示显示区域能够显示的区域。问题在不原创 2021-05-20 20:02:32 · 271 阅读 · 0 评论 -
码流的计算
两个重要的概念分辨率帧率分辨率X轴的像素个数x Y轴的像素个数常见的宽高比16:9/4:3以前的电视机、九几年的大屁股显示器基本上都是4:3,现在几乎都是16:9如果视频不是16:9的,说明不是便准的视频格式,要先转成16:9或者4:3,否则在渲染时可能与预期结果不同常见的分辨率 360p/720p/1k/2k360p是640x360,720p是1280x720,1k是1920x1080即1080p,2k是2560x1440即1440p,1K=210=1024,2K=21原创 2021-05-20 19:58:45 · 7103 阅读 · 0 评论 -
屏幕显示器
像素每一个像素都由RGB构成,即红绿蓝,每一个点都有由不同的颜色,最后拼成一幅图像。图像数据是有像素的,显示器是有像素的。屏幕屏幕的每一个点都是由三个发光二极管构成(红绿蓝),每三个二极管(红绿蓝)组成一个像素,图像与屏幕的关系图象是数据 -> 最终通过数据驱动整个屏幕去显示最终图像屏幕是显示设备图象数据经过驱动程序让屏幕显示图像RGB的色彩问题RGB与BGR显示器遇见BGR数据时并不知情,所以会造成显示色彩错误,此时需要做一层转换,转换为RGB数据后在进原创 2021-05-20 19:57:50 · 264 阅读 · 0 评论 -
图像的基本概念
视频由一组图像组成为了传输/占用更小的空间而被压缩最终在显示设备上展示(未被压缩)图像像素RGB分辨率像素图像由像素组成每个像素的位深RGB888(24位), 每一个元素占一个字节RGBA(32位), A代表Alpha,即透明度,颜色的透明度,全透明、半透明、不透明RGB像素由RGB组成,三原色,RED、GREEN、BLUE。由三个发光二极管组成(红绿蓝),根据发光二极管的不同亮度,组成不同的颜色显示。分辨率图像横向(X轴)像素个数,纵向(Y轴)像素个数的乘积原创 2021-05-20 19:56:32 · 1090 阅读 · 0 评论 -
音频压缩
音频压缩消除冗余信息 - 20HZ以下,2万HZ以上的数据人不敏感,属于无效 有损压缩无损压缩音频有损压缩音频冗余信息音频压缩技术是在保证信号在听觉方面不失真的前提下,对音频数据信号进行尽可能大的压缩。压缩的主要方法是去除采集到的音频荣冗余信息。所谓冗余信息包括人耳听觉范围外20HZ~2万HZ的音频信号以及被掩盖掉的音频信号。信号的遮蔽可以分为频域遮蔽和时域遮蔽频域遮蔽效应即简单来说就是在频率相近的情况下,强度大的遮蔽强度小的,但是无法遮蔽频率不相近的,哪怕是强度明显大于其强度时域原创 2021-05-20 19:53:53 · 1683 阅读 · 0 评论 -
音频录制
音频原始数据PCMPCM数据是采集到的纯的音频数据,也是最原始的数据。WAVWAV也是音频原始数据,只不过是在PCM的基础上加入了数据头,方便播放器使用正确的参数去播放。量化基本概念采样大小:一个采样用多少bit存放,常用的是16bit。也叫位深,位深越高描述的峰值越大,即描述声音的强度大采样率:采样频率8K、16K、32K、44.1K、48K,采样率越高数字信号与模拟信号之间模仿的越接近,误差越小,打电话时常是8K,略有失真。声道数:单声道、双声道、多声道,超过双声道的称为立体声。码率计原创 2021-05-20 19:50:38 · 321 阅读 · 1 评论 -
FFmpeg安装与配置(windows与mac)
FFmpeg命令行安装使用如下命令进行FFmpeg:sudo apt-get install ffmpegFFmpeg源码安装FFmpeg源码获取使用如下命令获取ffmpeg的源码:git clone https://git.ffmpeg.org/ffmpeg.git ffmpegffmpeg编译使用如下命令指定安装目录:./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --enable-shared --disa原创 2021-05-19 23:24:56 · 116347 阅读 · 16 评论