QQMusic-CLI 开发日记
关于 C++ 的一些知识
链接 链接性(Linkage)指的是符号(如变量和函数)在不同翻译单元之间的可见性。C/C++中有三种链接性:
- 内部链接性(Internal Linkage):符号只能在定义它的翻译单元内可见。
- 外部链接性(External Linkage):符号可以在多个翻译单元之间共享。默认情况下,函数和全局变量具有外部链接性。
- 无链接性(No Linkage):符号只能在定义它的块内可见。局部变量和函数参数具有无链接性。
对于全局变量和函数,有以下关键字可用于指定链接性:
static
static
修饰的全局变量和函数具有内部链接性,即只在它所处的翻译单元内可见。
1 | static int a = 100; |
extern
extern
修饰的全局变量和函数具有外部链接性,即可以在多个翻译单元之间共享。
1 | extern int a = 100; |
他们的定义可以在自身的翻译单元,也可以在别的翻译单元中。
const
const
修饰全局变量除了指定其为常量以外,还使其默认具有内部链接性,但可以显示指定extern
使其具有外部链接性。
1 | const int a = 42; // 具有内部链接性 |
inline
inline
修饰符修饰的函数和变量具有外部链接性,与extern
不同,inline
允许函数被定义多次,但是每个定义必须相同,称作外部静态链接。在此之前,如果把函数的实现和全局变量定义也写在头文件中,那么函数和变量就会被多个翻译单元同时定义,造成重复定义。使用inline
后,函数的实现和变量定义就可以写在头文件中。
1 |
|
这个头文件就不会引起重复定义。
库文件是用于在不同程序中重用代码而产生的,具体分为静态链接库和动态链接库两种。
动态库和静态库是两种用于代码重用和共享的库文件形式。他们在编译和链接过程中具有不同的行为和用途。
静态库是在编译时将库的代码复制到最终可执行文件中。静态库通常具有 .a
或 .lib
后缀。
- 编译时链接:静态库在编译时被链接到可执行文件中。
- 独立性:生成的可执行文件包含所有必要的库代码,因此在运行是不需要依赖外部库文件。
- 文件大小:大。
- 更新困难:如果库代码需要更新,必须重新编译所有使用该库的可执行文件。
动态库是在运行时由操作系统加载到内存中。动态库通常具有 .so
或 .dll
后缀。
- 运行时链接:动态库在运行时被链接到可执行文件中。
- 共享性:多个可执行文件可以共享同一个动态库,减少内存占用和磁盘空间。
- 文件大小:小。
- 更新方便:只需更新动态库文件。
GDB 调试
FFMpeg
FFmpeg
是一个强大的多媒体处理工具,广泛用于视频和音频的转换、处理等操作。以下是一些常用的 FFmpeg
参数:
输入和输出参数
-i <input_file>
:指定输入文件。<output_file>
:指定输出文件(通常放在参数的最后)。
格式转换
-f <format>
:指定输出格式,例如mp4
、mp3
、wav
等。
视频编码参数
-c:v <codec>
:指定视频编码器,比如libx264
、libx265
、mpeg4
。-b:v <bitrate>
:指定视频比特率,比如1M
表示 1 Mbps。-r <fps>
:设置视频帧率(如30
、60
等)。-s <resolution>
:设置分辨率(如1920x1080
)。-crf <value>
:恒定速率因子,控制视频质量(范围通常是0-51
,越低质量越好,常用23
左右)。-preset <speed>
:设置编码速度,例如ultrafast
、superfast
、veryfast
、faster
、fast
、medium
、slow
、slower
、veryslow
。越快文件越大,但编码速度越快。
音频编码参数
-c:a <codec>
:指定音频编码器,比如aac
、mp3
、pcm_s16le
。-b:a <bitrate>
:指定音频比特率,比如128k
。-ar <rate>
:设置音频采样率,比如44100
。-ac <channels>
:设置音频通道数,比如1
(单声道)或2
(立体声)。
截取和裁剪
-ss <time>
:设置开始时间,格式如00:01:30
表示从 1 分 30 秒处开始。-to <time>
:设置结束时间。-t <duration>
:设置持续时间,比如00:00:10
表示截取 10 秒长的视频。-vf "crop=w:h:x:y"
:裁剪视频的宽、高和起始位置。例如,crop=1920:1080:0:0
表示裁剪 1920x1080 的区域,从左上角开始。
缩放与旋转
-vf "scale=<width>:<height>"
:调整视频分辨率。-vf "transpose=<value>"
:旋转视频(0=90° 顺时针,1=90° 逆时针,2=水平翻转,3=垂直翻转)。
其他常用参数
-an
:去除音频。-vn
:去除视频。-y
:自动覆盖输出文件。-threads <num>
:设置线程数来加速处理。-filter_complex
:用于更复杂的滤镜操作(如叠加、拼接)。
示例
- 转换格式:
ffmpeg -i input.mp4 output.avi
- 截取视频:
ffmpeg -i input.mp4 -ss 00:00:30 -t 10 output.mp4
- 改变分辨率:
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
- 压缩视频:
ffmpeg -i input.mp4 -vcodec libx265 -crf 28 output.mp4
- 提取音频:
ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3
设计模式
Linux 进阶
- ps
- htop
挂起进程 - jobs 后台运行
- fg %1
nuhup
在命令后加&
符号,可以将命令放入后台运行。
systemd systemd status
jounalctl -eu
创建一个自己的服务
sudo vim /etc/systemd/system/myservice.service
1 | [Unit] |
重载配置文件sudo systemctl daemon-reload
使用 systemctl
命令启动、停止、重启服务sudo systemctl enable/disable ping
sudo systemctl start/stop/restart myservice
用户和权限
/etc/passwd
包含了所有用户的信息,包括用户名、密码、UID、GID、描述、家目录、登录 shell 等。etc/group
包含了所有用户组的信息,包括组名、GID、包含的用户等。
把用户加入docker
组,可以免密码使用docker
命令。
useradd
命令用于创建用户,-m
参数用于创建用户的家目录。usermod name -aG group username
命令用于修改用户信息。userdel
命令用于删除用户。
ls
硬链接数 所有者 所有组