服务端2月18日 10:03
FFmpeg Filter语法详解:缩放、裁剪、叠加和组合滤镜FFmpeg 的 Filter 是它区别于其他转码工具的核心能力——不只是格式转换,而是对画面的像素、音频的采样点做任意变换。但 Filter 的语法是出了名的难读:方括号标签、分号逗号混用、多个输入输出的管线。这篇文章先把语法规则讲透,再按场景列举常用滤镜。
## Filter 语法:三分钟搞懂
### 简单滤镜 vs 复杂滤镜
- `-vf "滤镜链"`:简单视频滤镜,单个输入,单个输出
- `-af "滤镜链"`:简单音频滤镜,同上
- `-filter_complex "滤镜图"`:复杂滤镜,可以有多个输入输出、分支和合并
能用 `-vf`/`-af` 解决的,不要用 `...服务端2月18日 10:05
FFmpeg性能优化:硬件加速对比、preset选择和实测数据FFmpeg 默认配置偏保守,处理 1080p 视频可能只有 0.5x 实时速度——1 小时的视频要转 2 小时。但调整几个参数就能提到 5x 甚至 20x。这篇文章从硬件加速、编码参数、多线程三个层面讲优化,并给出不同场景的推荐配置。
## 硬件加速方案对比
四种主流硬件加速,按你的 GPU 选择:
| 方案 | 适用硬件 | 编码器 | 解码参数 | 特点 |
|------|----------|--------|----------|------|
| NVENC/NVDEC | NVIDIA GPU | h264_nvenc, hevc_nvenc | -hwaccel ...服务端2月18日 10:07
FFmpeg C API集成:解码、编码和最容易踩的坑FFmpeg 的命令行工具够用的话,没人愿意碰它的 C API——函数多、生命周期复杂、版本间 API 变动频繁。但当你要做实时流处理、自定义滤镜链、或者把音视频能力嵌入产品时,命令行就不够了。这篇文章把 FFmpeg API 集成的核心流程讲清楚:从打开文件到解码、从编码到输出,以及最容易踩的坑。
## 核心库和职责
| 库 | 职责 | 你什么时候会用到 |
|---|---|---|
| libavformat | 封装格式(容器)读写 | 打开文件、读写 MP4/MKV/FLV 等 |
| libavcodec | 编解码 | 解码 H.264/AAC,编码 H.265/Op...服务端2月18日 10:08
FFmpeg报错怎么排查?编码、格式和推流问题解决方案用 FFmpeg 处理音视频,报错信息常常一句话带过,搜索引擎给你的答案又是"试试这条命令"却不解释原因。这篇文章按错误类型分类,每个问题先说原因再说解决方案。
## 编码问题
### "Error while opening encoder"——编码器不可用
原因:FFmpeg 编译时没包含该编码器,或者编码器名称拼写错了。
```bash
# 先确认编码器是否可用
ffmpeg -encoders | grep h264
```
如果列表里没有 `libx264`,说明编译时没加 `--enable-libx264`。解决方案:重新编译 FFmpeg 或安装完整版。Ubun...服务端2月18日 10:10
FFmpeg音频处理速查:格式转换、调音量、剪辑混音和降噪FFmpeg 做音频处理,不需要打开 DAW,一条命令就能完成格式转换、音量调整、剪辑拼接、降噪混音。但很多教程只是罗列命令,参数什么意思、什么场景该选什么参数,一笔带过。这篇文章把常用音频操作按场景分类,每个命令都解释关键参数。
## 提取和格式转换
### 从视频里提取音频
```bash
ffmpeg -i video.mp4 -vn -acodec copy audio.aac
```
`-vn` 禁用视频流,`-acodec copy` 音频直接拷贝不重编码(速度极快,但输出格式必须和源一致)。如果要转格式,就不能 copy:
```bash
ffmpeg -i vi...服务端2月18日 17:03
C语言指针和数组有什么区别?sizeof、退化和 &arr 一次讲清"数组名就是指针"——这句话对了一半,但在关键地方是错的。面试官最爱问的就是那一半:`sizeof(arr)` 和 `sizeof(ptr)` 差多少?`&arr` 和 `arr` 类型一样吗?数组传进函数后还能 `sizeof` 吗?搞不清这些,写代码时遇到诡异的 bug 也排查不了。
## 本质区别:存储的是什么
数组是一块连续内存,里面存的是数据本身。指针是一个变量,里面存的是地址。
```c
int arr[5] = {1, 2, 3, 4, 5}; // 20 字节连续内存,存了 5 个 int
int *ptr = arr; // 8...服务端2月18日 17:03
C语言内存泄漏怎么排查?五种泄漏模式和三个检测工具C 语言没有垃圾回收,内存管理全靠程序员手动 malloc/free。这种自由度换来的代价就是内存泄漏——分配了内存却没释放,进程的内存占用只增不减。短命程序无所谓,长期运行的服务端进程泄漏几十字节,跑几天就可能吃掉几个 G。
## 五种常见泄漏模式
### 忘了 free
最直接的原因,代码写着写着就漏了:
```c
void process(void) {
char *buf = malloc(1024);
do_something(buf);
// 函数结束,buf 没释放,1KB 泄漏
}
```
更隐蔽的情况是提前 return:函数中间某个错...服务端2月18日 17:03
C语言结构体内存对齐怎么算?三条规则和逐字节推演结构体内存对齐是 C 语言面试的经典问题,也是实际项目中踩坑率很高的话题——`sizeof` 打出来的结果比预想的大,序列化/反序列化时数据错位,跨平台通信时结构体大小不一致,根源都在对齐和填充。
## 为什么需要对齐
CPU 访问内存不是逐字节的,而是按字长(32 位系统 4 字节,64 位系统 8 字节)一次读取。如果一个 `int` 跨了两次读取的边界,CPU 要读两次再拼接,性能下降。某些架构(如 ARM、SPARC)直接抛硬件异常。
所以编译器在结构体成员之间插入填充字节,让每个成员的起始地址落在自己"自然边界"上——这就是对齐。
## 三条对齐规则
1. **成员对...服务端2月18日 17:04
C语言volatile关键字有什么用?四个场景和三个常见误区`volatile` 这个关键字,很多人知道它是"防止编译器优化",但具体优化了什么、为什么需要防、什么场景该用,一深问就答不上来。更关键的是,C 语言的 `volatile` 和 Java 的 `volatile` 完全不是一回事——前者只管编译器,不管内存屏障;后者有 happens-before 语义。把 Java 那套理解搬到 C 里,会写出并发 bug。
## volatile 到底防了什么优化
编译器看到一段代码反复读同一个变量,且中间没有写入,就会把值缓存到寄存器里,省去内存访问。这对普通变量是好事,但如果变量的值可能被外部因素改变——硬件、中断、另一个线程——缓存就会...服务端2月18日 17:04
C语言函数指针和回调函数怎么用?原理与常见坑一次讲清C语言里的函数指针,是不少人学了多年 C 仍然含糊的概念。倒不是因为它多复杂——本质上就是"把函数的入口地址存到变量里"——但声明语法看着劝退,项目里该用的时候又想不起来。回调函数更甚:知道 `qsort` 要传比较函数,但让自己设计一个事件系统,就不知道从哪下手了。
这篇文章从函数指针的声明和调用讲起,再到回调机制的原理和工程实践,最后说清楚容易踩的坑。
## 函数指针:存的是函数入口地址
函数编译后加载到内存,函数名就是入口地址。把这个地址赋给一个变量,这个变量就是函数指针。
声明方式看着别扭,但拆开看规律很清晰:
```c
int (*fp)(int, int); //...