惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
GbyAI
GbyAI
月光博客
月光博客
Recent Announcements
Recent Announcements
云风的 BLOG
云风的 BLOG
F
Full Disclosure
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
博客园 - Franky
V
V2EX
Recorded Future
Recorded Future
WordPress大学
WordPress大学
小众软件
小众软件
Webroot Blog
Webroot Blog
雷峰网
雷峰网
Vercel News
Vercel News
N
News and Events Feed by Topic
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
K
Kaspersky official blog
F
Fortinet All Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
Spread Privacy
Spread Privacy
博客园 - 叶小钗
罗磊的独立博客
D
Docker
Forbes - Security
Forbes - Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Register - Security
The Register - Security
A
About on SuperTechFans
B
Blog RSS Feed
I
InfoQ
T
Tailwind CSS Blog
G
Google Developers Blog
H
Help Net Security
V
Vulnerabilities – Threatpost
AWS News Blog
AWS News Blog
N
News and Events Feed by Topic
M
MIT News - Artificial intelligence
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
P
Proofpoint News Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
MyScale Blog
MyScale Blog
Latest news
Latest news

FFmpeg

[FFmpeg 的实时性太糟糕了] 后续 - V2EX intel qsv ffmpeg 编码问题 - V2EX FFmpeg 的实时性太糟糕了 - V2EX 早就听说过 ffmpeg,但是一直不知道有多牛 - V2EX 使用 FFmpeg 和 GPU 实现最简“图片+无损音频=视频”的方法 - V2EX FFmpegKit has been officially retired. There will be no further ffmpeg-kit releases. - V2EX 有没有精通 ffmpeg 的大佬帮我看下这个视频是怎么制作的 - V2EX 使用 FFmpeg 试图做个人用的转码点播服务端, 但 mpegts 多个切片间音频偶尔不连续? - V2EX 求助大佬们, FFmpeg 指令拉实时流转推的正确姿势到底是什么? - V2EX 在几乎不损失画质的前提下,怎么用 ffmpeg 把 h.264 格式的视频转换成 h.265 格式的? - V2EX 我又来询问 ffmpeg 问题了!这次是硬件加速! - V2EX 大佬们, nodejs 和 Python 做类似 jellyfin 实时转码是不是只能用 ffmpeg 实现了 - V2EX 有大佬开发过 ffmpeg 吗?用 c++调用 ffmpeg API 解码视频流 CPU 占用率高,求解决办法 - V2EX ffmpeg 视频录制切分问题请教 - V2EX 通过 ffmpeg 压缩视频很慢 时间敏感的需求该怎么设置参数呢? - V2EX ffmpeg 处理后视频时长问题 - V2EX 请教一个关于 ffmpeg 的问题 - V2EX 如何下载官方的 ffmpeg 二进制发布 - V2EX 视频模板替换图片,有偿 - V2EX ffmpeg 过滤器 xfade 自定义动画的研究 - V2EX 关于我在 fcp 导入视频时出现的无法解决的问题,请求各位 ffmpeg 大佬的帮忙 - V2EX go + ffmpeg pipe 怎么确定当前转码操作已经结束,可以停了 - V2EX 给人声视频加入背景声音,如何做到自动调整背景的音量 - V2EX 使用 ffmpeg 用 aes 加密 m3u8 文件的疑惑 - V2EX 把歌曲压缩至 7 kbps, FFmpeg 之父发布音频压缩工具 TSAC - V2EX 求助使用 ffmpeg 压缩.mov 视频输出后丢失元数据问题如何解决 - V2EX homebrew 安装的 fmpeg 转码速度比较慢?直接编译可以提高速度吗? - V2EX 使用 nodejs 调用和在 macos 终端里直接调用 ffmpeg 转 m3u8,两者花费时间相差巨大 - V2EX FFmpeg 如何录屏时排除录制指定的某个窗口 - V2EX ffmpeg 最近大版本发布为啥这么快 - V2EX ffmpeg 如何加快解码速度?算力不变的情况下,不在乎解码质量 - V2EX FFmpeg 怎么支持 segment_size 选项? - V2EX FFmpeg 使用 debug_ts 打印全过程的 pts - V2EX ffmpeg 如何更快速的查询视频的"缺帧" - V2EX 如何将 AVS3 8KHDR 视频转码为 HEVC 8KHDR 视频? - V2EX 请教大佬们,在线网站抓到 m3u8 能播放,但是用 ffmpeg 下载的时候 “403 forbidden” 或者 “Output file #0 does not contain any stream” 应该怎么解决 - V2EX FFmpeg 使用 qsv 加速失败 - V2EX 使用 ffmepg 把图片和长音频转换为视频的时候,视频和音频的时间对不上,声音也减少了一半 - V2EX FFmpeg 解码器如何识别码流格式变了? - V2EX ffmpeg 提取音频中有声部分并单独生成文件 - V2EX ffplay 如何并行下载 m3u8 - V2EX 如何用 ffmpeg 找到损坏的视频 50 块钱悬赏答案 - V2EX ffmpeg 如何压缩 h.265 的视频不丢帧? - V2EX 有没有 win 下已编译好的 FLV 标准支持 H265 的 ffmpeg? - V2EX 为什么有些视频体积这么大但是画质这么差? - V2EX lalserver 流媒体(直播音视频网络传输)服务器 v0.30.1 2022.6.15 - V2EX [求助] mp4 录制,怎么才能不缓冲在内存中 - V2EX ffmpeg 怎么处理 h265 切 h264 的直播流? - V2EX 为什么 ffmpeg 加不上 rotate 旋转参数 - V2EX
为什么 ffmpeg 的体积会这么大?多复杂的算法编译后也不会有几十 MB 吧? - V2EX
LLaMA · 2023-03-25 · via FFmpeg
secondwtq

29

secondwtq      2023 年 3 月 26 日   ❤️ 29

这是个有趣的问题。实际上如果只是想把一个东西做得体积很大很简单,一个真实的故事:
一个算法有 2 个较为固定的参数,每个参数有 5 种可能性,那么如果我把这些参数静态编译进去就是 25 种可能性,如果再考虑到在 5 种不同硬件上的组合,那就是 125 种。如果假设每种的代码有 1KB 大,再有三四十个类似的算法,光这玩意就能整出 4MB 来。

类似地,如果工程中涉及到根据外部数据文件生成可执行代码,如 RPC 协议通信等,随着数据越来越多,附加的代码也会越来越多。

另外,编译器优化也可能导致代码体积的指数增长,常见地例如:
* 如果一个函数里面出现了对其他函数的多次独立调用,而这些函数又被 inline 。该函数实际生成的代码会包含子函数代码的多个拷贝。如果多个函数 inline 了同一个函数,该子函数代码会被在不同函数中多次拷贝。
* 如果一个函数被多次调用,并且调用时使用了常量参数,该函数的代码可能会被拷贝多份,并将常量参数代入其中单独优化。
* 循环的 unroll 会将循环体代码拷贝多份(虽然一般会有一定的长度限制)。
* 循环的向量化会将循环体代码拷贝多份(不同于 unroll ,这个是向量化逻辑所必须的,因此一般不会限制)。

我这有个对比的例子是 GTK3 。目前我这的 GTK3 包一共 49MB ,不过里面有一堆 GTK 元数据和 locale 之类的东西。只看最关键的 libgtk-3.so ,这玩意一共 7.8 MB ,其中 .text 大概有 3.7MB ,由 500 多个 .o 链接而成,这些 .o 的 .text 大小相加和 libgtk-3.so 的 .text 差不多。.text 最大的前 10% 的 .o ,.text 大小加起来大概 1.6MB 。这些 .o 对应的源码大小加起来大概 7.6MB 。总的源码大小是 17MB (只算 .c ,不算 header )。把 .o 的 .text 大小,和对应 .c 文件的大小画个图,可以很清楚地发现 .c 文件的大小大概是 .text 大小的 4-6 倍,平均值是 5 倍左右。

ffmpeg 包一共 37MB ,其中最大的是 libavcodec.so ,15MB 。.text 有 10MB 。大概有 1100 个 .o (我去除了一部分直接汇编出的 .o ,这些 .o 的 .text 加起来大概 1MB )。.text 最大的前 10% 的 .o ,.text 大小加起来大概 5.3MB 。这些 .o 对应的源码大小加起来大概 5.6MB ,总的源码大小是 19MB 。部分 .o 依然满足 4-6 倍的规律,但是整体的分布分散了许多。很多头部的 .o ,其 .c 文件大小是 .text 文件大小的两倍,一倍,甚至零点几倍。总的来说相比 GTK3 ,ffmpeg 编译生成的 .text 要更大。
进一步研究源码发现:
* libavcodec 源码中有很多以 _template.c 结尾的文件,加起来 1MB 左右,这些文件并不会直接编译出 .o (因此并不会计算在上面的 .c 大小上),而主要是被以不同的参数(如位深度)等多次 include 到不同的 .c 中,其实类似于模拟 C++ 的 non-type template parameter 。这些文件中的代码自然也会被拷贝多份。
* 部分源码大量使用了定义宏再多次以不同参数使用宏的技巧,这个还是类似于 non-type template parameter ,同样会导致同样的代码被拷贝多份。
* .o 中的代码存在大量 inline 的痕迹。也出现了一些 constprop 函数。源码中大量函数标记了 always_inline 。

#14 的链接中指出使用 --enable-small 选项(即指示编译器优先优化代码体积)可以数倍降低 libavcodec.so 的大小。暗示编译器优化是巨大体积的重要因素。不过我实测的效果并没有那么吼,.text 大概降低了 40% 左右。相对地,libgtk-3.so 降低了不到 20%。不过确实可以看到很多的 .o 文件 .text 大小成倍地缩小。GTK3 则鲜有缩小超过 30% 的 .o 。