开源(Open Source,开放源码)被非盈利软件组织(美国的Open Source Initiative协会)注册为认证标记,并对其进行了正式的定义,用于描述那些源码可以被公众使用的软件,并且此软件的使用、修改和发行也不受许可证的限制。开源项目的所有者不属于任何组织或个人。在遵守开源协议的条件下,开源产品可通过修改代码定制成属于自己的个性化产品。
讲解开源项目
一组中文的系列文章,介绍各种开源项目和用法。
程序员追求开源软件,但是开源软件压低了软件价格,软件价格过低又降低了程序员的价值,并因此使得许多程序员失去工作,也减少了投资者对软件行业的投资,因为投资者追逐利润丰厚的地方来投资。
– 《开源软件对软件商品化的挑战》
Why
SQLite 的代码托管在 Fossil 上,永远不会迁移到 Git。Fossil 专为支持 SQLite 开发而设计,并且做得非常好。与 Git / GitHub 相比,Fossil 填补了不同的市场。
Timescale 数据库宣布使用”云保护许可证”,即他们的开源软件不得用于提供云服务。这主要是为了防止亚马逊之类的公司使用别人的开源软件,开设自己的云服务赚钱。
只有开放才能打败封锁
美国搞技术封锁,不允许中国企业使用美国技术。今天就来谈谈,应该怎么应对这种局面。
华为最近宣布,9月15日以后,手机的麒麟芯片无法生产了,可能将成为绝响,因为台积电迫于美国的禁令,不再接受华为的订单了。
此前,华为手机已经不能预装谷歌服务框架了。但是,安卓系统是开源的,就算不能用上层的谷歌服务,系统本身还是可以用的。
这就是开源软件的好处,它不受美国政府的控制,禁令影响不到它。如果安卓系统是闭源的,华为手机就麻烦了,将没有操作系统可用。有人说,可以自己搞操作系统啊。事实上,这是不现实的。华为的鸿蒙系统就算能搞出来,到哪里去找应用软件呢?怎么说服腾讯和阿里,为你开发鸿蒙版的微信和支付宝呢?最后只能搞一个虚拟机,让安卓应用跑在里面,但那也是建立在安卓是开源系统的基础上啊。
正是因为有了开源软件,才有办法对抗美国的技术封锁。要是有一天,美国不允许中国使用 Windows,那么至少还有 Linux。为了国家的技术安全,就应该考虑多使用开源软件。
开源软件还有一个好处,它有助于推广技术,扩大影响力。中国拥有知识产权的技术或软件,变成世界主流的案例越多,美国的封锁就越不容易奏效。一项技术怎么才能变成业界的主流,开源是一个很有效的方法。
所以我觉得, 政府应该把开源软件定为国家战略
。 鼓励国人多使用开源软件(比如 Linux),摆脱对专有技术的依赖;同时,鼓励企业和个人将自己的智力成果与全世界共享,打破美国的技术霸权。最终来说,只有开放才能打败封锁。
What
微软宣布,将在 Windows 上通过 Linux子系统(WSL)添加 Linux GUI 支持,即 Windows 原生支持 Linux 图形界面程序。这意味着,大部分 Linux 应用将可以在 Windows 运行。
中国电子书厂商 Onyx 拒绝发布设备源码,那是根据 Linux 内核改的,明显违反了 GPL 许可证。Reddit 社区正在讨论,开源软件有没有办法在中国维权。
一家美国创业公司设计了 TGPPL 开源许可证,最大特点是提供了闭源宽限期,允许发布后12个月内闭源。
信息的商业模式,不应该是收费,而是应该鼓励更多的人消费它。 越多人消费,信息的价值越高,这时就可以开发增值服务,从服务赚钱。
11款开源数据库简介(英文)
这篇文章介绍11种主要的开源数据库,每一种的特点和适用场景。但是不包括 MySQL,因为作者假设你在寻找 MySQL 的替代品。
Linus 不再编程了
2020年5月,Linux 基金会一年一度的峰会上,Linux 创始人莱纳斯·托瓦尔兹(Linus Torvalds)与 VMware 公司副总裁兼首席开源官 Dirk Hohndel 进行了对话。
Dirk Hohndel 问 Linus,现在的工作流程是怎样的。
Linus 说,我现在整天就是读 Email,写 Email,再也不编程了。
我现在写的大部分代码,都是在 Email 里面。某人给我发来一个补丁,或者一个 Pull Request,或者跟我讨论,我就写一段伪代码,不编译也不测试,发给对方看,然后在邮件里加上一句”我觉得应该这么写”。
我现在就干这些事,我不再是程序员了。
我每天读的 Email,要比写的多得多。 因为我的工作说到底,就是拒绝其他人的代码。总是需要有一个人来拒绝其他人,其他开发者知道代码写得不好,会被我拒绝,就会更小心。为了能够有说服力地拒绝他人,我不得不知道事情的前因后果,否则我就不称职了。所以基本上,我的所有时间都用来读其他人的 Email,必须知道他们在干嘛……这工作很有意思,但是你不得不把大部分时间用来读 Email。
对于开发者,我希望大家不仅只是写出好的代码,还必须很善于解释自己的代码。代码的提交信息,对我来说,几乎跟代码本身一样重要。有时,代码的意图非常明显,不需要解释,但是这种情况极其少。我对开发者的一个希望就是,能够更好地解释他们的代码是干嘛的,为什么需要变更以前的代码。这样的话,我管理起来就比较容易,如果你能够解释清楚,我就能信任这些代码。
开源软件的一大部分其实是交流,而交流包括提交信息,也包括来来回回的 Email。告诉别人你想做什么,为什么原来的代码你觉得要改,真的是非常重要的一件事。
How
21世纪初,开源运动兴起时,微软站在历史错误的一边,没有支持开源。好消息是,如果你的寿命足够长,就有机会改变。
– 微软总裁布拉德·史密斯
Example
FFmpeg 视频处理入门教程
FFmpeg 是视频处理最常用的开源软件。
它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是许多音频和视频格式的标准编码/解码实现。
FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具。本文介绍 FFmpeg 命令行如何处理视频,比桌面视频处理软件更简洁高效。
如果你还没安装,可以根据官方文档 先完成安装。
一、概念
介绍 FFmpeg 用法之前,需要了解一些视频处理的基本概念。
1.1 容器
视频文件本身其实是一个容器(container),里面包括了视频和音频,也可能有字幕等其他内容。
常见的容器格式有以下几种。一般来说,视频文件的后缀名反映了它的容器格式。
MP4
MKV
WebM
AVI
下面的命令查看 FFmpeg 支持的容器。
1 | $ ffmpeg -formats |
1.2 编码格式
视频和音频都需要经过编码,才能保存成文件。不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。
常用的视频编码格式如下。
H.262
H.264
H.265
上面的编码格式都是有版权的,但是可以免费使用。此外,还有几种无版权的视频编码格式。
VP8
VP9
AV1
常用的音频编码格式如下。
MP3
AAC
上面所有这些都是有损的编码格式,编码后会损失一些细节,以换取压缩后较小的文件体积。无损的编码格式压缩出来的文件体积较大,这里就不介绍了。
下面的命令可以查看 FFmpeg 支持的编码格式,视频编码和音频编码都在内。
1 | $ ffmpeg -codecs |
1.3 编码器
编码器(encoders)是实现某种编码格式的库文件。只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码。
以下是一些 FFmpeg 内置的视频编码器。
libx264:最流行的开源 H.264 编码器
NVENC:基于 NVIDIA GPU 的 H.264 编码器
libx265:开源的 HEVC 编码器
libvpx:谷歌的 VP8 和 VP9 编码器
libaom:AV1 编码器
音频编码器如下。
libfdk-aac
aac
下面的命令可以查看 FFmpeg 已安装的编码器。
$ ffmpeg -encoders
二、FFmpeg 的使用格式
FFmpeg 的命令行参数非常多,可以分成五个部分。
1 | $ ffmpeg {1} {2} -i {3} {4} {5} |
上面命令中,五个部分的参数依次如下。
全局参数
输入文件参数
输入文件
输出文件参数
输出文件
参数太多的时候,为了便于查看,ffmpeg 命令可以写成多行。
1 | $ ffmpeg \ |
下面是一个例子。
1 | $ ffmpeg \ |
上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。
如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。
1 | $ ffmpeg -i input.avi output.mp4 |
三、常用命令行参数
FFmpeg 常用的命令行参数如下。1
2
3
4
5
6
7
8
9-c:指定编码器
-c copy:直接复制,不经过重新编码(这样比较快)
-c:v:指定视频编码器
-c:a:指定音频编码器
-i:指定输入文件
-an:去除音频流
-vn: 去除视频流
-preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
-y:不经过确认,输出时直接覆盖同名文件。
四、常见用法
下面介绍 FFmpeg 几种常见用法。
4.1 查看文件信息
查看视频文件的元信息,比如编码格式和比特率,可以只使用-i参数。
1 | $ ffmpeg -i input.mp4 |
上面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息。
1 | $ ffmpeg -i input.mp4 -hide_banner |
4.2 转换编码格式
转换编码格式(transcoding)指的是, 将视频文件从一种编码转成另一种编码。比如转成 H.264 编码,一般使用编码器libx264,所以只需指定输出文件的视频编码器即可。
1 | $ ffmpeg -i [input.file] -c:v libx264 output.mp4 |
下面是转成 H.265 编码的写法。
1 | $ ffmpeg -i [input.file] -c:v libx265 output.mp4 |
4.3 转换容器格式
转换容器格式(transmuxing)指的是,将视频文件从一种容器转到另一种容器。下面是 mp4 转 webm 的写法。
1 | $ ffmpeg -i input.mp4 -c copy output.webm |
上面例子中,只是转一下容器,内部的编码格式不变,所以使用-c copy指定直接拷贝,不经过转码,这样比较快。
4.4 调整码率
调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。
1 | $ ffmpeg \ |
4.5 改变分辨率(transsizing)
下面是改变视频分辨率(transsizing)的例子,从 1080p 转为 480p 。
$ ffmpeg \
-i input.mp4 \
-vf scale=480:-1 \
output.mp4
4.6 提取音频
有时,需要从视频里面提取音频(demuxing),可以像下面这样写。
1 | $ ffmpeg \ |
上面例子中,-vn表示去掉视频,-c:a copy表示不改变音频编码,直接拷贝。
4.7 添加音轨
添加音轨(muxing)指的是,将外部音频加入视频,比如添加背景音乐或旁白。
1 | $ ffmpeg \ |
上面例子中,有音频和视频两个输入文件,FFmpeg 会将它们合成为一个文件。
4.8 截图
下面的例子是从指定时间开始,连续对1秒钟的视频进行截图。
1 | $ ffmpeg \ |
如果只需要截一张图,可以指定只截取一帧。
1 | $ ffmpeg \ |
上面例子中,-vframes 1指定只截取一帧,-q:v 2表示输出的图片质量,一般是1到5之间(1 为质量最高)。
4.9 裁剪
裁剪(cutting)指的是,截取原始视频里面的一个片段,输出为一个新视频。可以指定开始时间(start)和持续时间(duration),也可以指定结束时间(end)。
1 | $ ffmpeg -ss [start] -i [input] -t [duration] -c copy [output] |
下面是实际的例子。
1 | $ ffmpeg -ss 00:01:50 -i [input] -t 10.5 -c copy [output] |
上面例子中,-c copy表示不改变音频和视频的编码格式,直接拷贝,这样会快很多。
4.10 为音频添加封面
有些视频网站只允许上传视频文件。如果要上传音频文件,必须为音频添加封面,将其转为视频,然后上传。
下面命令可以将音频文件,转为带封面的视频文件。
1 | $ ffmpeg \ |
上面命令中,有两个输入文件,一个是封面图片cover.jpg,另一个是音频文件input.mp3。-loop 1参数表示图片无限循环,-shortest参数表示音频文件结束,输出视频就结束。
Microsoft Edge
Microsoft Edge 是最新版本。
版本 80.0.361.48 (官方内部版本) (64 位)
此浏览器基于 Chromium 开源项目及其他 开源软件。
适合自己架设的开源远程办公软件(英文)
很多企业进行远程办公时,使用自己架设的开源软件会更方便,本文就介绍一些主要的选择。
聊天:Mattermost 和 Matrix
云存储:Nextcloud
项目管理:Redmine
代码托管:Gitlab
openVidu
一个开源的视频会议软件,使用 WebRTC 技术。
bigbluebutton
开源的远程教育软件,也可用作视频会议。
Awesome Open Source
该网站对 GitHub 上的开源项目进行分类,共有7000多个类别。
awesome-icons
这个仓库收集免费的图标资源。
Mozilla 裁员
Mozilla 本周宣布裁员250人。这其实不算意外,它的全球雇员超过1000人,但是主要产品都是免费的,这样的雇员规模可能确实太大了。
裁员的一个后果就是,MDN 文档团队基本上被裁掉了,只剩下很少的人,MDN 以后可能都要靠志愿者维护。由于 MDN 是 Web 开发事实上的标准文档,这件事恐怕会对全球的开发者造成很大影响。这也反应了,文档是有代价的,优质文档很难免费提供。
APIJSON
腾讯的官方开源项目,自动化 RESTful 接口生成。前端描述自己需要的 JSON 数据,后端自动生成接口和文档。
Post-Pages-to-IPFS
一个开源的在线工具,可以将文章发布到 IPFS 网络。一经发布就无法再删改,理论上可以永久储存。
Reference
- Open Source Initiative (OSI)
- OSChina
- 阿里开源
- 腾讯开源
- GitHub上Stars最多的10个Python项目
- 开源中国
- GitHub 上值得学习的开源实战项目(持续更新中,万字长文建议收藏)
- GitHub 2019 年度报告解读:开源生态和技术趋势
- Julia、Delta Lake 榜上有名!2019 年最佳开源软件奖公布
- 2019 十大国产开源项目来势汹汹!
- 2020 年最具潜力 44 个顶级开源项目,涵盖 11 类 AI 学习框架、平台
- 自由软件基金会向微软寄空硬盘,希望其贡献Windows 7源码
- GitHub 中文项目排行榜
- Creative Commons授权条款的源流与演变
- 华为加入全球最大专利保护社区OIN,该社区已有超3200名成员
- 小米开源Redmi Note 8 Pro / Note 9 Pro系列内核源码:基于Android 10
- HashiCorp 产品禁止中国公司使用,引发对开源软件受限制的担忧
- 我如何从 GitHub 赞助年收入10万美元
- 10个日常使用的 Linux 应用程序
- 开源项目维护者的九个阶段