操作系统:学会这些你就能对 Linux 操作系统了如指掌
在平时的生活中,我们几乎时时刻刻都在使用操作系统,只是大部分时间你都意识不到它的存在。 操作系统到底在背后默默地做了哪些事情,才能让我们轻松地使用电子设备呢? 不知道你有没有产生过这些疑问:
桌面上的图标到底是啥?凭啥我在鼠标上一双击,就会出来一个美丽的画面?这都是从哪里跑出来的?
电脑怎么知道我鼠标点击的是这个地方,又是怎么知道我要输入的是这个地方?
为什么我一回车,这些字符就发到遥远的另外一台机器上去了?
对于普通用户来讲,其实只要会用就行了,但是咱们作为专业人士,要深入探究一下背后的答案。 操作系统其实就像一个软件外包公司,其内核就相当于这家外包公司的老板。为什么这么说呢?
假设,我们现在就是在做一家外包公司,我们的目标是把这家公司做上市。其中,操作系统就是这家外包公司的老板。 我们把这家公司的发展阶段分为这样几个时期:
初创期 :这个老板基于开放的营商环境(x86 体系结构),创办一家外包公司(系统的启动)。因为一开始没有其他员工,老板需要亲自接项目(实模式)。
发展期 :公司慢慢做大,项目越接越多(保护模式、多进程),为了管理各个外包项目,建立了项目管理体系(进程管理)、会议室管理体系(内存管理)、文档资料管理系统(文件系统)、售前售后体系(输入输出设备管理)。
壮大期 :公司越来越牛,开始促进内部项目的合作(进程间通信)和外部公司合作(网络通信)。
集团化 :公司的业务越来越多,会成立多家子公司(虚拟化),或者鼓励内部创业(容器化),这个时候公司就变成了集团。大管家的调度能力不再局限于一家公司,而是集团公司(Linux 集群),从而成功上市(从单机操作系统到数据中心操作系统)。
把外包公司做上市的过程,就是我们对 Linux 操作系统从入门到精通的过程。 要做到对 Linux 了如指掌,我认为你需要爬 6 个陡坡。
第一个坡:抛弃旧的思维习惯,熟练使用 Linux 命令行
上手 Linux 的第一步,要先从 Windows 的思维习惯,切换成 Linux 的“ 命令行 + 文件”使用模式。不过,在这个专栏里,命令行并不是我们的重点,但是考虑到一些刚起步的同学,在第一部分我会简单介绍一些能够让你快速上手 Linux 的命令行。专栏每一模块的第一节,我都会有针对性地讲解这一模块的常用命令,足够你把 Linux 用起来。
第二个坡:通过系统调用或者 glibc,学会自己进行程序设计
用代码操作 Linux,可以直接使用 Linux 系统调用,也可以使用 glibc 的库。 如果说使用命令行的人是吃馒头的,那写代码操作命令行的人就是做馒头的。 你会发现,你平时用的一个简单的命令行,却需要 N 个系统调用组合才能完成。其中每个系统调用都要进行深入地学习、读文档、做实验。经过一段时间的学习,你已经很接近操作系统的原理了,你能看到另一番风景。
第三个坡:了解 Linux 内核机制,反复研习重点突破
进一步了解内核的原理,有助于你更好地使用命令行和进行程序设计,能让你的运维和开发水平上升一个层次。Linux 内核机制是我们这个专栏重点要讲述的部分,我会基于最新 4.x 的内核进行讲解,当然我也意识到了内核机制的复杂性,所以我选择通过 故事性和图形化 的方式,帮助你了解并记住这些机制。
第四个坡:阅读 Linux 内核代码,聚焦核心逻辑和场景
一旦爬上这个坡,对于操作系统的原理,你应该就掌握得比较清楚了。这个时候,你就可以有针对性地去做课题,把所学和你现在做的东西结合起来重点突破。例如你是研究虚拟化的,就重点看 KVM 的部分;如果你是研究网络的,就重点看内核协议栈的部分。
第五个坡:实验定制化 Linux 组件,已经没人能阻挡你成为内核开发工程师了
纸上得来终觉浅,绝知此事要躬行。从只看内核代码,到上手修改内核代码,这又是一个很大的坎。例如,你可以自己实现一个设备驱动程序,实现一个自己的系统调用,或者实现一个自己的文件系统等等。专栏最后一个部分,我专门设计了两个实验,帮你度过这个坎。只要跟着我的步伐进行学习,接下来,就没人能够阻挡你成为一名内核开发工程师了。
第六个坡:面向真实场景的开发,实践没有终点
说了这么多,我们都只是走出了万里长征第一步。我始终坚信,真正的高手都是在实战中摸爬滚打练出来的。
如果你是运维,仅仅熟悉上面基本的操作是不够的,生产环境会有大量的不可控因素,尤其是集群规模大的更是如此,大量的运维经验是实战来的,不能光靠读书。
如果你是开发,对内核进行少量修改容易,但是一旦面临真实的场景,需要考虑各种因素,并发与并行,锁与保护,扩展性和兼容性,都需要真实项目才能练出来,下面是针对初学者的 15个 FFmpeg 命令:
FFmpeg 命令的典型语法是:
ffmpeg [全局选项] {[输入文件选项] -i 输入_url_地址} ... {[输出文件选项] 输出_url_地址} ...
现在我们将查看一些重要的和有用的 FFmpeg 命令。
1、获取音频/视频文件信息
为显示你的媒体文件细节,运行:
$ ffmpeg -i video.mp4
样本输出:
ffmpeg version n4.1.3 Copyright (c) 2000-2019 the FFmpeg developersbuilt with gcc 8.2.1 (GCC) 20181127configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3libavutil 56. 22.100 / 56. 22.100libavcodec 58. 35.100 / 58. 35.100libavformat 58. 20.100 / 58. 20.100libavdevice 58. 5.100 / 58. 5.100libavfilter 7. 40.101 / 7. 40.101libswscale 5. 3.100 / 5. 3.100libswresample 3. 3.100 / 3. 3.100libpostproc 55. 3.100 / 55. 3.100Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':Metadata:major_brand : isomminor_version : 512compatible_brands: isomiso2avc1mp41encoder : Lavf58.20.100Duration: 00:00:28.79, start: 0.000000, bitrate: 454 kb/sStream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/smpte170m), 1920x1080 [SAR 1:1 DAR 16:9], 318 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)Metadata:handler_name : ISO Media file produced by Google Inc. Created on: 04/08/2019.Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)Metadata:handler_name : ISO Media file produced by Google Inc. Created on: 04/08/2019.At least one output file must be specified
如你在上面的输出中看到的,FFmpeg 显示该媒体文件信息,以及 FFmpeg 细节,例如版本、配置细节、版权标记、构建参数和库选项等等。
如果你不想看 FFmpeg 标语和其它细节,而仅仅想看媒体文件信息,使用 -hide_banner
标志,像下面。
$ ffmpeg -i video.mp4 -hide_banner
样本输出:
使用 FFMpeg 查看音频、视频文件信息。
看见了吗?现在,它仅显示媒体文件细节。
2、转换视频文件到不同的格式
FFmpeg 是强有力的音频和视频转换器,因此,它能在不同格式之间转换媒体文件。举个例子,要转换 mp4 文件到 avi 文件,运行:
$ ffmpeg -i video.mp4 video.avi
类似地,你可以转换媒体文件到你选择的任何格式。
例如,为转换 YouTube flv 格式视频为 mpeg 格式,运行:
$ ffmpeg -i video.flv video.mpeg
如果你想维持你的源视频文件的质量,使用 -qscale 0
参数:
$ ffmpeg -i input.webm -qscale 0 output.mp4
为检查 FFmpeg 的支持格式的列表,运行:
$ ffmpeg -formats
3、转换视频文件到音频文件
我转换一个视频文件到音频文件,只需具体指明输出格式,像 .mp3,或 .ogg,或其它任意音频格式。
上面的命令将转换 input.mp4 视频文件到 output.mp3 音频文件。
$ ffmpeg -i input.mp4 -vn output.mp3
此外,你也可以对输出文件使用各种各样的音频转换编码选项,像下面演示。
$ ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3
在这里,
-vn
– 表明我们已经在输出文件中禁用视频录制。-ar
– 设置输出文件的音频频率。通常使用的值是22050 Hz、44100 Hz、48000 Hz。-ac
– 设置音频通道的数目。-ab
– 表明音频比特率。-f
– 输出文件格式。在我们的实例中,它是 mp3 格式。
4、更改视频文件的分辨率
如果你想设置一个视频文件为指定的分辨率,你可以使用下面的命令:
$ ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4
或,
$ ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4
上面的命令将设置所给定视频文件的分辨率到 1280×720。
类似地,为转换上面的文件到 640×480 大小,运行:
$ ffmpeg -i input.mp4 -filter:v scale=640:480 -c:a copy output.mp4
或者,
$ ffmpeg -i input.mp4 -s 640x480 -c:a copy output.mp4
这个技巧将帮助你缩放你的视频文件到较小的显示设备上,例如平板电脑和手机。
5、压缩视频文件
减小媒体文件的大小到较小来节省硬件的空间总是一个好主意.
下面的命令将压缩并减少输出文件的大小。
$ ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4
请注意,如果你尝试减小视频文件的大小,你将损失视频质量。如果 24 太有侵略性,你可以降低 -crf
值到或更低值。
你也可以通过下面的选项来转换编码音频降低比特率,使其有立体声感,从而减小大小。
-ac 2 -c:a aac -strict -2 -b:a 128k
6、压缩音频文件
正像压缩视频文件一样,为节省一些磁盘空间,你也可以使用 -ab
标志压缩音频文件。
例如,你有一个 320 kbps 比特率的音频文件。你想通过更改比特率到任意较低的值来压缩它,像下面。
$ ffmpeg -i input.mp3 -ab 128 output.mp3
各种各样可用的音频比特率列表是:
96kbps
112kbps
128kbps
160kbps
192kbps
256kbps
320kbps
7、从一个视频文件移除音频流
如果你不想要一个视频文件中的音频,使用 -an
标志。
$ ffmpeg -i input.mp4 -an output.mp4
在这里,-an
表示没有音频录制。
上面的命令会撤销所有音频相关的标志,因为我们不要来自 input.mp4 的音频。
8、从一个媒体文件移除视频流
类似地,如果你不想要视频流,你可以使用 -vn
标志从媒体文件中简单地移除它。-vn
代表没有视频录制。换句话说,这个命令转换所给定媒体文件为音频文件。
下面的命令将从所给定媒体文件中移除视频。
$ ffmpeg -i input.mp4 -vn output.mp3
你也可以使用 -ab
标志来指出输出文件的比特率,如下面的示例所示。
$ ffmpeg -i input.mp4 -vn -ab 320 output.mp3
9、从视频中提取图像
FFmpeg 的另一个有用的特色是我们可以从一个视频文件中轻松地提取图像。如果你想从一个视频文件中创建一个相册,这可能是非常有用的。
为从一个视频文件中提取图像,使用下面的命令:
$ ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png
在这里,
-r
– 设置帧速度。即,每秒提取帧到图像的数字。默认值是 25。-f
– 表示输出格式,即,在我们的实例中是图像。image-%2d.png
– 表明我们如何想命名提取的图像。在这个实例中,命名应该像这样image-01.png、image-02.png、image-03.png 等等开始。如果你使用%3d
,那么图像的命名像 image-001.png、image-002.png 等等开始。
10、裁剪视频
FFMpeg 允许以我们选择的任何范围裁剪一个给定的媒体文件。
裁剪一个视频文件的语法如下给定:
ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4
在这里,
input.mp4
– 源视频文件。-filter:v
– 表示视频过滤器。crop
– 表示裁剪过滤器。w
– 我们想自源视频中裁剪的矩形的宽度。h
– 矩形的高度。x
– 我们想自源视频中裁剪的矩形的 x 坐标 。y
– 矩形的 y 坐标。
比如说你想要一个来自视频的位置 (200,150),且具有 640 像素宽度和 480 像素高度的视频,命令应该是:
$ ffmpeg -i input.mp4 -filter:v "crop=640:480:200:150" output.mp4
请注意,剪切视频将影响质量。除非必要,请勿剪切。
11、转换一个视频的具体的部分
有时,你可能想仅转换视频文件的一个具体的部分到不同的格式。以示例说明,下面的命令将转换所给定视频input.mp4 文件的开始 10 秒到视频 .avi 格式。
$ ffmpeg -i input.mp4 -t 10 output.avi
在这里,我们以秒具体说明时间。此外,以 hh.mm.ss
格式具体说明时间也是可以的。
12、设置视频的屏幕高宽比
你可以使用 -aspect
标志设置一个视频文件的屏幕高宽比,像下面。
$ ffmpeg -i input.mp4 -aspect 16:9 output.mp4
通常使用的高宽比是:
16:9
4:3
16:10
5:4
2:21:1
2:35:1
2:39:1
13、添加海报图像到音频文件
你可以添加海报图像到你的文件,以便图像将在播放音频文件时显示。这对托管在视频托管主机或共享网站中的音频文件是有用的。
$ ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
14、使用开始和停止时间剪下一段媒体文件
可以使用开始和停止时间来剪下一段视频为小段剪辑,我们可以使用下面的命令。
$ ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 50 output.mp4
在这里,
–ss
– 表示视频剪辑的开始时间。在我们的示例中,开始时间是第 50 秒。-t
– 表示总的持续时间。
当你想使用开始和结束时间从一个音频或视频文件剪切一部分时,它是非常有用的。
类似地,我们可以像下面剪下音频。
$ ffmpeg -i audio.mp3 -ss 00:01:54 -to 00:06:53 -c copy output.mp3
15、切分视频文件为多个部分
一些网站将仅允许你上传具体指定大小的视频。在这样的情况下,你可以切分大的视频文件到多个较小的部分,像下面。
$ ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4
在这里,
-t 00:00:30
表示从视频的开始到视频的第 30 秒创建一部分视频。-ss 00:00:30
为视频的下一部分显示开始时间戳。它意味着第 2 部分将从第 30 秒开始,并将持续到原始视频文件的结尾。