![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
FFmpeg源码分析
文章平均质量分 81
Loken2020
音视频工程师,《FFmpeg原理》作者
展开
-
split_commandline解析中间状态
split_commandline解析中间状态原创 2023-03-29 20:28:52 · 132 阅读 · 0 评论 -
ffmpeg_parse_options命令行解析
ffmpeg_parse_options函数分析原创 2023-03-29 20:29:05 · 6228 阅读 · 0 评论 -
Qt使用FFmpeg的静态库
本文讲解 如何在 qt creator 引入 FFmpeg 的静态库,静态库是通过 msys2 + msvc 编译出来的,参考 《用msys2与msvc编译FFmpeg》,只要在 configure 的时候不使用 就会编译出静态库。FFmpeg 的静态库跟动态库只能二选一,如果都想要,需要编译两次。编译完成之后,静态库如下:这些 .a 文件实际上就是 msvc 的 lib 静态库,只是后缀名不一样。这里提醒一下,这些静态库 只是 FFmpeg 本身代码的目标文件的集合,外部的扩展静态库没有在这些 .a 文原创 2022-07-05 14:54:27 · 1289 阅读 · 0 评论 -
Qt使用FFmpeg的动态库
C/C++ 项目有两种编译方式,MinGW 跟 MSVC,如下:1,《MinGW编译静态库》2,《MSVC编译静态库》但是 MinGW 编译的静态库,是不能给 MSVC 的链接器使用的,虽然两者编译器生成的 .o 跟 .obj 目标文件是 ABI 兼容的,但是他们的链接器不通用。而 静态库 实际上就是把 目标文件 打包在一起,所以 MinGW 编译的静态库,只能给 MinGW 编译方式的项目使用。MSVC 同理。下面来讲一下 qt creator 如何引入 用 MinGW 方式编译出来的 FFmpeg 动态原创 2022-07-05 14:53:36 · 1640 阅读 · 0 评论 -
Qt安装教程
Qt 实际上是一个 C++ 的桌面图形窗口类库,就是一些 lib 跟 dll ,只要把这些 类库引入自己的项目,就能调qt类库做一些操作,例如创建窗口。所以你可以把 这些 qt 的 类库配置在 vs2019, clion 里面使用都是可以的。Qt 公司还专门给 Visual Studio 提供了一个 Qt 插件。Visual Studio Qt 插件 是“ Visual Studio Add- in 2. 0. 0 for Qt5 MSVC 2015”, 可以从Qt官网下载并安装。不过 qt 官方提供了一个原创 2022-07-05 14:52:39 · 91859 阅读 · 13 评论 -
FFmpeg的API库介绍
ffmpeg.exe 实际上也是 调这 8个库的函数实现的。而 ffmpeg.exe 主要由一个 5 千行的 ffmpeg.c 文件实现的。原创 2022-07-05 14:51:23 · 1046 阅读 · 0 评论 -
FFmpeg引入x264扩展
Windows10系统下 FFmpeg 与 x264 的编译教程,包括 MSVC 跟 MinGW 两种方式原创 2022-07-05 14:50:07 · 3026 阅读 · 2 评论 -
FFmpeg引入SDL扩展
Windows10 系统下 FFmpeg与SDL的编译教程,包括 MSVC 跟 MinGW 两种方式原创 2022-07-05 14:16:01 · 820 阅读 · 0 评论 -
调试基础知识及原理
个可调试的可执行文件。我个人觉得里面的内容可以分为3个部分。1,机器码。C/C++ 转成的机器码2,符号表信息(symbols)3,调试信息(debug info)无论是 Linux 的GDB,还是 Windows 的 WinDbg 跟 VsDebug,都是根据上面这些信息来进行调试的。...原创 2022-06-13 14:31:09 · 1649 阅读 · 0 评论 -
ShiftMediaProject项目介绍
ShiftMediaProject项目介绍原创 2022-06-13 14:29:23 · 1268 阅读 · 2 评论 -
用WinDbg断点调试FFmpeg
本文主要讲解 WinDbg 调试器的使用。WinDbg在 Windows 里面的地位,就跟 GDB 在 Linux 的地位一样。可以通过 微软的官方网站 安装 WinDbg。WinDbg 是比较轻量级的调试工具,在一些场景下比较实用,例如不方便安装 vs2019。...原创 2022-06-13 14:27:16 · 680 阅读 · 0 评论 -
用VsDebug断点调试FFmpeg
前面两篇文章已经讲解了如何在 windows 编译出 ffmpeg.exe 文件。在 Windows 平台有没类似 gdb 调试工具可以断点调试可执行文件呢?Windows 平台主要有两款调试工具。1,VsDebug,集成在 vs2019 里面的调试器。vs 系列都是用的 VsDebug。2,WinDbg,Windows诞生之初的第一款功能全面的调试器,目前依然应用广泛。例如 qt creator 的 MSVC 环境调试就是用的 WinDbg。...原创 2022-06-13 14:25:24 · 714 阅读 · 0 评论 -
MPEG-TS封装格式
先讲一下MPEG是什么,MPEG 全称 Moving Picture Experts Group (动态影像专家小组),该专家组是联合技术委员会(Joint Technical Committee, JTC1)的一部分,JTC1 是由 ISO(国际标准化组织)和 IEC(国际电工委员会)建立的。JTC1 负责信息技术,在 JTC1 中,下设有负责“音频、图像编码以及多媒体和 超媒体信息”的子组 SG29。在 SG29 子组中,又设有 多个工作小组,其中就包括 JPEG(联合图片专家组)和 负责活动图像压..原创 2022-05-20 13:08:28 · 2171 阅读 · 0 评论 -
编码压缩介绍
从前文我们知道,YUV420 已经比 YUV444 数据少了一半,而且体验几乎感受不到差别。如下:从上图可以看到,虽然数据减少了一般,但是一张 1080p 的图片也有 3038kb 的大小,也就是 3Mb 大小,动画看起来流畅,需要一秒播放 24 张图片,1个小时的电影大小如下:3 *24 * 60 * 60 = 2592003∗24∗60∗60=259200因此,1小时的YUV420 的电影,需要 253G 空间来存储,截止 2022 年,一个普通的硬盘,才500G大小,只能存两部电影。所以 即使原创 2022-05-20 13:06:34 · 2037 阅读 · 0 评论 -
YUV数据分析
在 前文中,已经知道 YUV 色彩空间非常适合存储跟传输,本文就用实战的方式来演示一下,YUV 在存储跟传输领域有哪些优点。首先 YUV 有 3 种采样模式:1,4:4:4 ,一个像素 占 3 个字节。2,4:2:2,平均一个像素占 2 个字节。3,4:2:0,平均一个像素占 1.5 个字节。请先下载下面要用到的图片资源,百度网盘,提取码:ea7s 。资源文件中的 yuv 图片是我用以下 FFmpeg 命令转出来的,ffmpeg -i juren.jpg -s 1920*1080原创 2022-05-20 13:05:34 · 3711 阅读 · 0 评论 -
RGB与YUV相互转换
从前文已经知道,R,G,B,3个分量都跟 亮度密切相关,也就是 3个分量里面都有大量的亮度信息。RGB 转 YUV 的过程实际上就是 把 RGB 3分量里面的亮度信息 提取出来,放到 Y 分量。再把 RGB 3分量里面的 色调 ,色饱和度 信息提取出来放到 U跟 V分量。所以这是一个信息提取过程,需要经过大量的实验。提取 Y 亮度信息的公式如下:$$Y = Kr * R + Kg * G + Kb * B$$上面公式中的 K 是一个权重因子,Kr 代表 红色通道的权重,Kg 代表原创 2022-05-20 13:03:27 · 9441 阅读 · 0 评论 -
YUV色彩空间
虽然日常生活中接触得比较多的是 RGB 色彩空间,但是还有另一种比较常用的色彩空间 是 YUV。RGB 色彩空间更适合图像采集和显示, YUV 空间用于编码和存储则比较好。在存储和编码之前,RGB 图像要转换为 YUV 图像,而 YUV 图像在 显示之前通常有必要转换回 RGB。这里显示的时候 YUV 转成 RGB 通常是硬件或者软件内部做了,我们写代码开发的时候 这个 YUV 转 RGB 显示到屏幕这个过程通常是透明的。无论是 RGB 还是 YUV ,他们都是 表达 色彩信息的一种方式。可以把原创 2022-05-20 13:03:49 · 4746 阅读 · 0 评论 -
RGB色彩空间
我们平时接触最多的色彩空间 是 RGB,上学的时候就学过三原色,所有的颜色可以通过三原色产生,这 三原色 就是 Red (红),Green(绿),Blue(蓝)。做 web 前端的同学也会经常用过 RGB 来指定 页面元素的 颜色。RGB 格式目前主要有两类: 像素格式,这是我们比较常用的格式,R,G,B 分别分开用N个位来表示。例如RGB24格式中 R 占 8位,G 占 8位,B 占8 位,所以一个像素占 24位。这种格式可以混合生成 256256256 = 16,777,216 种颜色...原创 2022-05-20 12:57:04 · 2395 阅读 · 0 评论 -
封装格式分析-MP4
声明:MP4 的封装格式是比较复杂的,本文不会把 MP4 的各个字段,各种场景用法都罗列出来,那样会形成一个手册。文本主要讲解 MP4 这种封装格式在音视频开发中比较常用的字段,还有一些关键的知识点。让初学者掌握 MP4 的一些基本概念,然后学会看MP4标准文档深入了解。资源下载:a.mp4下载链接:百度网盘,提取码:nl0s 。 Mp4Explorer.exe 下载链接:百度网盘,提取码:039r 。MP4 格式 是一个 box 的格式,box 容器 套 box 子容器,box 子容器 再原创 2022-03-25 21:42:43 · 3025 阅读 · 0 评论 -
如何成为ffmpeg开发者
假设你已经阅读完 本站的 《源码分析》专栏。具备编译,调试 ffmpeg 源代码的能力。本文主要介绍如何 一步一步成为 ffmpeg 开发者。提前了解:ffmpeg 的 git 仓库:https://git.ffmpeg.org/gitweb/ffmpeg.git git 使用手册:《廖雪峰 git 》 刘歧分享:《FFmpeg开源社区项目与文化》,百度网盘,提取码:37r9先介绍一下简单操作。克隆最新的 ffmpeg 代码,把代码拉到本地git clone https://git.原创 2022-03-25 04:58:19 · 1289 阅读 · 3 评论 -
FFmpeg,Fplay,clion调试环境搭建
本系列 以 ffmpeg4.4 源码为准。本文主要讲解如何搭建 ffplay 的CLion调试环境。 ffmpeg 在 Linux 环境下更好调试。本文系统是 Ubuntu 18,首先下载 FFmpeg-n4.4.1.zip ,虽然 FFmpeg 是通过 makefile 编译的,但是还是可以用Clion来调试,比 gdb 更直观一些。CLion 目前的最新版本比较完善,早几年我用的时候,调试好像必须提供 CMakeList 文件,现在只有 makefile 文件也能用 Clion 调试了。操作..原创 2022-03-15 15:31:58 · 1980 阅读 · 0 评论 -
ffmpeg命令分析-vframe
本文 以 ffmpeg4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg.exe-i a.mp4-ss00:00:7.435-vframes1out.png上面的命令是 偏移到 7 秒左右的地方,截图 一张图片来进行保存。-ss在 《ffmpeg命令分析-ss》里面已经讲过,本文不再分析,本文主要讲解-vframes参数在 ffmpeg 工程中的实现。vframes的定义如下:{ "vframes", OPT_V...原创 2022-03-14 22:55:53 · 2168 阅读 · 0 评论 -
ffmpeg命令分析-map_channel
本文 以 ffmpeg4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg.exe -i a.mp4 -map_channel 0.1.0 left.aac -map_channel 0.1.1 right.aac上面的命令 是把 a.mp4 里面的左右声道分布存储在 left.aac ,right.aac 里面。下面主要分析 一下-map_channel0.1.0参数的作用。在 ffmpeg_opt.c 的定义如下:{ "map_ch...原创 2022-03-14 22:54:13 · 1031 阅读 · 0 评论 -
ffmpeg复杂滤镜-filter_complex
本文 以 ffmpeg4.4 源码为准。a.mp4下载链接:百度网盘,提取码:nl0s 。logo.jpg 地址:点击查看命令如下:ffmpeg.exe -i a.mp4 -i logo.jpg -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" output.mp4 -y上面命令实现的功能就是 把 "弦外之音" 的 logo 放在视频左上角。ffmpeg 命令行有两种 filter 用法:原创 2022-03-14 22:53:37 · 8213 阅读 · 0 评论 -
ffmpeg命令分析-tee输出多路流
本文 以 ffmpeg4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s 。早期 FFmpeg 在 转 码 后 输出 直播 流 时并 不支持 编码 一次 之后 同时 输出 多路 直播 流, 需要 使用 管道 方式 进行 输出, 而在 新版本 的 FFmpeg 中 已经 支持 tee 文件 封装 及 协议 输出, 可以 使用 tee 进行 多路 流 输出, 本节 将 主要 讲解 管道 方式 输出 多路 流 与 tee 协议 输出 方式 输出 多路 流。刘歧; 赵文杰. FFmpeg从入原创 2022-03-14 06:17:40 · 1805 阅读 · 0 评论 -
ffmpeg命令分析-拉取TCP流
本文 以 ffmpeg4.4 源码为准,a.mp4下载链接:百度网盘,提取码:nl0s 。TCP推流命令如下:ffmpeg.exe -re -i a.mp4 -c copy -f flv tcp://127.0.0.1:1234/live/streamTCP拉流命令如下:ffmpeg.exe -listen 1 -i tcp://127.0.0.1:1234/live/stream -c copy -f flv output.flv -yffmpeg 除了支持 RTMP,HTTP 等原创 2022-03-14 06:17:03 · 3852 阅读 · 2 评论 -
ffmpeg命令分析-pix_fmt
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg -vcodec h264 -i a.mp4 -pix_fmt nv12 -vcodec h264_mf -acodec copy a_h264_nvenc.mp4 -y上面的命令是解码,然后编码,本文不关注编解码,主要分析-pix_fmt nv12参数,由于一些硬件...原创 2022-03-14 06:16:25 · 5564 阅读 · 0 评论 -
FFmpeg硬件加速
本文 ffmpeg4.4.1 源码为准,用以下命令分析 ffmpeg.c 里面的硬件加速逻辑实现。命令如下:ffmpeg.exe -hwaccel cuvid -vcodec h264_cuvid -i juren_10s.mp4 -vcodec h264_nvenc -acodec copy juren_h264_nvenc_10s.mp4 -y以上命令使用 h264_cuvid 硬件解码 MP4,然后再使用 h264_nvenc 硬件编码成 MP4。juren_10s.mp4 下载地址,百原创 2022-03-14 06:15:26 · 8939 阅读 · 1 评论 -
ffmpeg命令分析-yuv封装mp4
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.yuv 下载链接:百度网盘,提取码:1h1w 。命令如下:ffmpeg-s720*404-pix_fmt yuv420p-i a.yuv-vcodec libx264 a-666.mp4上面的命令是 把 yuv 数据 编码成 H264,然后封装进 MP4 格式里面。yuv文件本身没有 宽高信息,像素格式信息,所以需要命令行指定-...原创 2022-03-13 06:26:33 · 3015 阅读 · 0 评论 -
ffmpeg命令分析-yuv420p
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-i a.mp4-pix_fmt yuv420p a.yuv上面的命令是转成 yuv 的封装格式,封装格式前面《ffmpeg命令分析-acc》已经讲过了,本文主要讲解,a.mp4 原本是有音频的,转成yuv之后音频没有,所以本文主要讲解音频是如何丢包的。如下图在 o...原创 2022-03-13 06:25:43 · 2521 阅读 · 0 评论 -
ffmpeg命令分析-print
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-i a.mp4-vcodec libx264-preset placebo output.mp4本文不讲上面的命令行参数实现,而是打算讲解,ffmpeg 转码过程中输出的 frame ,fps,q,size, bitrate ,speed 的意义,如下图。最重要的是...原创 2022-03-13 06:24:56 · 1557 阅读 · 1 评论 -
ffmpeg命令分析-acc
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-i a.mp4-vn-acodec copy output.aacFFmpeg 抽取音视频文件 中的 AAC 音频 流,与上一条命令ffmpeg-i a.mp4-vn-acodec copy output.mp4相比。只是封装格式不同,这篇文章就来讲解,如...原创 2022-03-13 06:24:16 · 1540 阅读 · 0 评论 -
ffmpeg命令分析-vn
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-i a.mp4-vn-acodec copy output.mp4上面的命令是单独抽取文件中的音频流到 输出文件命令行参数 -vn 定义如下:ffmpeg_opt.h 3569行{ "vn",OPT_VIDEO | OPT_BOOL | OPT_OFFSE...原创 2022-03-12 13:50:32 · 1445 阅读 · 0 评论 -
ffmpeg命令分析-output_ts_offset
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-i a.mp4-t5-output_ts_offset5a2.flv-output_ts_offset 5,设置输出文件的所有流的第一帧位5秒,后续帧从5秒开始递增。命令行参数 -output_ts_offset 定义如下:options_table....原创 2022-03-12 13:48:49 · 823 阅读 · 0 评论 -
ffmpeg命令分析-ss
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-ss3-i a.mp4 a2.mp4-ss 3,seek 到输入文件的第三秒开始提取视频命令行参数 -ss 定义如下:ffmpeg_opt.c 3412行{ "ss",HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT ...原创 2022-03-12 13:48:06 · 3970 阅读 · 0 评论 -
ffmpeg命令分析-t
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-i a.mp4-t10a2.mp4-t 10,从开头截取10秒的视频数据。命令行参数 -t 定义如下:ffmpeg_opt.c 3404行{ "t", HAS_ARG | OPT_TIME | OPT_OFFSET | OPT_INPUT | OPT_O...原创 2022-03-12 13:47:21 · 1717 阅读 · 0 评论 -
ffmpeg命令分析-segment
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令参数 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:ffmpeg-i a.mp4-c copy-f segment test_output-%d.mp4-f segment,ffmpeg 切分视频文件,前面加 -c copy 是为了避免重新编解码,加快切分速度。命令行参数 -f 定义如下:ffmpeg_opt.c 3371...原创 2022-03-12 13:46:43 · 2720 阅读 · 0 评论 -
ffmpeg命令分析-r
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8之前的文章分析 FFMpeg 工程的 do_video_out() 函数的时候,建议不关注delta0,delta,nb0_frames,nb_frames等变量。因为在之前的命令没有用帧率变换参数,-r 。所以上面这些变量赋值,有跟没有是一样的。现在来补一下之前缺失的内容。命令行指定 -r 之后,delta0,delta,nb0_frames,nb_frames的变化。本文章主要讲解 FFMpeg 里...原创 2022-03-11 17:51:05 · 4549 阅读 · 0 评论 -
ffmpeg命令分析-ac
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:./ffmpeg-i a.mp4-ac1output.flv,这里的输入文件是双声道,这条命令是把双声道转成单声道。在 ffmpeg 中,双声道转单声道是用aformat filter实现的, 在 ffmpeg 工程的代码实现如下:解析命令行参数到 编码器context 的...原创 2022-03-11 17:48:50 · 7597 阅读 · 0 评论 -
ffmpeg命令分析-vf
本系列 以 ffmpeg4.2 源码为准,下载地址:链接:百度网盘提取码:g3k8本系列主要分析各种 ffmpeg 命令 在代码里是如何实现的。a.mp4下载链接:百度网盘,提取码:nl0s 。命令如下:./ffmpeg -i a.mp4 -vf "split[main][tmp];[tmp]crop=iw:ih/2:0:0,vflip[flip];[main][flip]overlay=0:H/2" OUTPUT上这行命令是一个simple filter 处理,在 ffmpeg 工程的代.原创 2022-03-11 17:42:12 · 10031 阅读 · 0 评论