#601 调整视频文件中音频流的顺序

2021-08-28

ffprobe

ffprobe movie.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'movie.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2020-02-20T06:07:54.000000Z
  Duration: 01:43:14.16, start: 0.000000, bitrate: 2844 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1495 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc (default)
    Metadata:
      creation_time   : 2020-02-20T06:07:54.000000Z
    Stream #0:1(und): Audio: ac3 (ac-3 / 0x332D6361), 44100 Hz, stereo, fltp, 448 kb/s (default)
    Metadata:
      creation_time   : 2020-02-20T06:08:03.000000Z
    Side data:
      audio service type: main
    Stream #0:2(und): Audio: ac3 (ac-3 / 0x332D6361), 44100 Hz, 5.1(side), fltp, 448 kb/s (default)
    Metadata:
      creation_time   : 2020-02-20T06:09:02.000000Z
    Side data:
      audio service type: main
    Stream #0:3(und): Audio: ac3 (ac-3 / 0x332D6361), 44100 Hz, 5.1(side), fltp, 448 kb/s (default)
    Metadata:
      creation_time   : 2020-02-20T06:09:29.000000Z
    Side data:
      audio service type: main

ffmpeg

ffmpeg -loglevel info -i movie.mp4 -ss 00:29:08.0 -to 00:31:25.0 -s 1280x720 -c copy -map 0:v:0 -map 0:a:0 -map 0:a:1 -map 0:a:2 test.mp4

# 输入,复制,设置第一个音频流为默认,输出
# 发现其他几个音频流不见了,输出文件中只有一个音频流
ffmpeg -i movie.mp4 -c copy -disposition:a:1 default 冰雪奇缘2_new.mp4

ffmpeg -i movie.mp4 -c copy -map 0:v:0 -map 0:a:1 -map 0:a:0 -disposition:a:0 default  -disposition:a:1 0 冰雪奇缘2_new2.mp4

解析:输入,复制(不重新编码),

-map 0:v:0
-map 0:a:1
-map 0:a:0

-c / -codec
-c:v
-c:a
-c:s
-c:d
[mp4 @ 0x556a8afca7c0] track 1: codec frame size is not set

ffmpeg -i test.mp4 -frames 1 -f image2 /tmp/image.png

#600 为什么我还没有用上 IPv6?

2021-08-27
  1. IPv6 是个好东西
  2. 我们都知道 IPv6 是个好东西
  3. 我们都想用上 IPv6

那么问题来了,为什么现在还没有大规模普及 IPv6 呢?我想了半天,得到了一个答案:因为我没做好准备。

确切的说,应该是:无数个我一样的人没有做好准备。
IPv4 很简单的一串数字,虽然世界上大部分人可能都不知道它是个啥,但肯定也存在相当比例能够理解这个概念的人,这对于一项技术的普及很有必要。
但是 IPv6,我作为一个开发者都说不清楚,更别提其他普通用户了。

#599 什么是一个设计良好的系统?

2021-08-24

在满足需求、有良好的使用体验(基于真实的用户看法,不是开发者自己觉得)基础上,进一步提更高的要求:

  • 接口响应超时
  • CPU load 升高
  • 内存
  • GC 频繁
  • 死锁
  • 大数据量存储

一、三高(高可用 + 高性能 + 高并发)

1.1 高可用(可用性) Availability

可用性强调的是服务的总体持续时间,比如可用性级别为三个九(99.9%)意味着一年 365 天里总共停止服务 8.76 个小时。

可靠性 Reliability

  • 功能如预期运行(宁可抛出异常,不要默默地给错误运行)
  • 出现故障的频率
  • 出现故障也应该不对系统造成太大的影响
  • 可维修性:故障定位容易、修复步骤简单、修复成本低廉

和高可用的区别:

  1. 大部分时候,这两个指标都是密切相关的
  2. 如果我有一个电视机,每天都准时看儿童频道的《动漫世界》一个小时,然后过去三年也都用得挺好,没有送去修过(导致我看不了),那可以说高可用了(正常运行时间 / 预期运行时间),但是如果这个电视机每次看的时候可能隔一会儿需要拍一巴掌(中间出雪花的时间可以忽略),那这就不能说这个电视机是可靠了。
  3. 又比如说,我又买了另一个电视机,不需要拍巴掌了,我看的挺开心,不过才高兴两年,坏了,看不了了,楼下电器维修店的小哥搞不定,联系厂家售后维修,一下就是两周看不了电视。对于一个家用电器,两年坏一次可以说高可靠,但是可用性就有问题了((365 - 7) / 365 = 98%)。

  4. MTBF Mean Time Between Failure 无故障时间,每隔多久遇到一次故障

  5. MTTR Mean Time To Repair 修复时间,每次遇到故障需要维修多久
  6. MTTF Mean Time To Failure

  7. 根据当前的可用性级别,然后指定合理的可行性目标

  8. 操作规范/最佳实践
  9. 预防性维护 Preventive Maintenance
  10. 合理的 PM 计划:可实施,正确的时机
  11. 重点是影响最大的故障
  12. 不断的改进和优化

稳定性 Stability

  • 系统运行平稳(不一定如预期执行)

连续性 Continuity

故障出现之后的处理能力:故障能否快速修复,能否不影响主要业务的运行。

比如我有两台电视机,坏了一台,我还有另一台可以看,虽然另一台是之前淘汰的一台黑白电视,效果差点,好歹能用啊。
这台电视就是我们常说的灾难备份,或者说容灾备份。

1.2 高性能 HP Performance

  • 处理速度快
  • 资源占用低

1.3 高并发 HC Concurrency

  • 响应时间
  • 吞吐量
  • 并发用户数

二、安全性

  • 基础设施安全:操作系统、网络、数据库
  • 数据安全
  • 脱敏:降低数据泄漏所产生的消极影响

三、易用性

四、其他

3.1 可测试性

3.2 可维护性

运维方便,运营方便,二次开发方便

  • 代码注释与文档
  • 合理的日志
  • 监控与数据统计
  • 误操作发生率低
  • 可理解性:代码可读性,合理的技术框架/系统架构
  • 可拓展性:新增功能不需要修改现有结构的能力。分层,合理的耦合度(尽可能的高内聚、低耦合),合理的功能抽象,数据结构可拓展

3.3 可伸缩性 Scalable/Scalability

在系统不需要修改(顶多改改配置)的前提下,通过增加或减少硬件资源来动态提升或降低系统各项能力。

  1. 通常采用服务器集群的方式。
  2. 集群一上来,就和高可用有很大关联。

3.4 可扩展性 Extensibility

通过合理的设计,使得新增功能时,不需要改动现有功能,或者只需要对现有系统进行少量调整就行。
总之,将新功能对现有业务逻辑的影响降到最低。

3.5 可观测性

能够方便快捷的了解到程序运行情况。
合理的日志,指标数据的暴露(Pull/Push)。

#598 Golang 学习资料

2021-08-24
  1. 官方文档镜像:https://docs.studygolang.com/
  2. Golang PlayGround: https://play.golang.org/ (自动跳到 https://go.dev/play/)
  3. https://awesome-go.com/
  4. https://github.com/avelino/awesome-go
  5. https://github.com/jobbole/awesome-go-cn 中文版
  6. Go语言爱好者周刊
  7. 开源图书
  8. Go 入门指南
    《The Way to Go》中文版
  9. 高效的 Go 编程
    《Effective Go》中文版
  10. Go语言标准库
    《The Golang Standard Library by Example》中文版
  11. 极客兔兔,七天用Go从零实现系列

#596 HTML 总结

2021-08-21

HTML5 的一个重要变化是彻底放弃 XML 化路线,也就是所谓的 “no logger based on SGML”,事实上 HTML5 就是因为浏览器厂商和 W3C 之间存在是否应该 XML 化这个分歧才诞生出来的。最终厂商联盟 WHATWG 获胜,取得了标准制定方面的绝对话语权(W3C 设计的 XHTML2 胎死腹中),其他的功能上的大跨度变化(除了本身的功能增加之外,对外设备连通性,性能)都只能算是副产品。

我们常说的 H5 实际上是 HTML5 + CSS3, JS 一般好像没有要求,应该还是默认 ES5, 不过现在 ES6 目前也已经在主流浏览器上得到了很好的支持。

黄色:废弃
绿色:新增
红色:非标准

标签

基础框架

  1. <!DOCTYPE>
  2. <!-- -->
  3. html
  4. head
  5. body
  6. title
  7. meta
  8. base
  9. basefont
  10. style
  11. link

文档结构

  1. p
  2. h1 ... h6
  3. ul, ol, li
  4. dl, dt, dd
  5. dir 使用 ul 替代
  6. span
  7. div
  8. table, tr, td, th, thead, tbody, tfoot, col, colgroup, caption
  9. a

样式/排版

  1. abbr, acronym 简写
  2. bdo 文字书写方向
  3. b, strong
  4. big, small
  5. center
  6. font
  7. i 斜体
  8. s, stike 中划线
  9. u 下划线
  10. del, ins 删除、插入,默认就是加上中划线和下划线
  11. em 强调
  12. dfn 术语
  13. q, blockquote, cite 引用
  14. address
  15. var 变量
  16. samp 样本
  17. kbd
  18. br
  19. hr
  20. sub, sup
  21. ruby, rt, rp
  22. pre, code

图片/视频/音频

  1. img
  2. map
  3. area
  4. canvas
  5. figcaption
  6. figure
  7. piture
  8. svg
  9. audio
  10. video
  11. source
  12. track

表单

  1. form
  2. input
  3. select
  4. textarea
  5. button
  6. option, optgroup
  7. label
  8. legend
  9. datalist 配合 input 使用
  10. output

Frame

  1. frame
  2. frameset
  3. noframes
  4. iframe

程序

  1. script
  2. noscript
  3. embed 可能是 v4 没有纳入标准
  4. object
  5. param
  6. applet

语义标签

  1. main
  2. header
  3. footer
  4. nav
  5. article
  6. aside
  7. section
  8. details
  9. dialog
  10. menu
  11. menuitem 火狐
  12. summary

Web Components

Custom Elements
H5 特性。

新的 API

  1. SVG
  2. Canvas
  3. 音频/视频
  4. WebRTC
  5. 本地存储
  6. WebStorage: LocalStorage + SessionStorage
  7. IndexedDB
  8. WebSQL
    PS: WebSQL 相关规范已经冻结,所以现在不属于 HTML5 标准,只有 Safari 和 Chrome 系浏览器支持。
    火狐全力支持 IndexedDB,认为一项标准不应该依赖一个具体的实现(SQLite),而且对于在网页端执行 SQL 非常不看好。
  9. WebAssembly
    这同样不属于 HTML5 的范畴,不过也是一项重要的标准,可能对 Web 开发产生很大的影响。
  10. WebSockets
  11. Server-Sent Event
  12. 2D/3D (WebGL)
  13. XMLHttpRequest Level 2

参考资料与拓展阅读

#595 Discuz! Q

2021-08-21

在看腾讯云服务器时,意外看到一个镜像的名称是 Discuz! Q,看这个名字,难道康盛发了新产品?

打开官网,从其介绍中了解到:

  1. 完全重写的版本
  2. 真开源:Apache 2.0 协议
    从官网下载的包可以看到代码中的版权声明确实是 Apache 2.0 协议,不是之前那种语焉不详的中国特色 “开源” 协议
    不过,官网号称即将上到 GitHub,但距离第一个版本发布已经一年半了,依然不能在 GitHub 上找到相关仓库
  3. 读写分离:后端 PHP7,前端 Vue.js
  4. H5 友好

其他:

  1. 更新记录
    Discuz! Q alpha v0.1.200124 2020/1/24  第一个版本
    Discuz! Q RC v1.0.200715    2020/7/15  第一个正式版本
    Discuz! Q RC v3.0.210824    2020/8/24  最新版本
    
    1. 官方演示站:https://discuz.chat/ 如果感兴趣可以打开看看。

既然腾讯有投入,那说明这个东西还是有一定价值啊,不知道阿里巴巴收购的 PHPWind (09 年就歇菜了) 会不会再起来蹦跶蹦跶?

#594 Python 源码学习 07: list

2021-08-19

cpython/Include/cpython/tupleobject.h

INIT_TYPE(&PyList_Type, "list");
SETBUILTIN("list", &PyList_Type);

PyTypeObject PyList_Type 的定义在 Objects/listobject.c 中。

成员方法

相关的方法在 #define LIST_.+_METHODDEF 的定义中,比如 extend 方法:

#define LIST_APPEND_METHODDEF    \
    {"append", (PyCFunction)list_append, METH_O, list_append__doc__},

static PyObject *
list_append(PyListObject *self, PyObject *object)
/*[clinic end generated code: output=7c096003a29c0eae input=43a3fe48a7066e91]*/
{
    if (app1(self, object) == 0)
        Py_RETURN_NONE;
    return NULL;
}

static int
app1(PyListObject *self, PyObject *v)
{
    Py_ssize_t n = PyList_GET_SIZE(self);

    assert (v != NULL);
    if (n == PY_SSIZE_T_MAX) {
        PyErr_SetString(PyExc_OverflowError,
            "cannot add more objects to list");
        return -1;
    }

    if (list_resize(self, n+1) < 0)
        return -1;

    Py_INCREF(v);
    PyList_SET_ITEM(self, n, v);
    return 0;
}

#592 软件工程

2021-08-15
  • 分析:产品需求文档 (Product Requirements Document, PRD)
  • 设计:模型,模式,业务规则,软件架构
  • 编码:开发,验证,集成
  • 测试:测试
  • 维护:安装部署 Deploy、升级 Upgrade、配置、迁移 Migration、集成 Integration、评估 Evaluation 、技术支持 Support

https://www.ruanyifeng.com/blog/2019/03/agile-development.html
敏捷开发入门教程
https://docs.microsoft.com/zh-cn/devops/plan/what-is-agile-development
什么是敏捷开发?

净室
CMMI
RUP
极限编程 XP
Scrum
Kanban
RAD

分析
设计
编码
测试
维护:运维,运营,售后工程师

技术写作:

  • 用户手册 User Guide
  • 开发手册 Developer Guide
  • 管理员手册 Administrator Guide
  • 故障排除 Troubleshooting
  • 问答 FAQs (Frequently Asked Questions)
  • 发布说明 Release Notes
  • 白皮书 Whitepaper
  • How To Guide
  • 用户案例 User Cases / Success Stories

开发模型

CMM,能力成熟度模型 Capability Maturity Model
CMMI,能力成熟度模型集成 Capability Maturity Model Integration,还有要给中文商标:希迈

GJB5000
GJB 5000-2003 军用软件能力成熟度模型
GJB 5000A-2008 军用软件研制能力成熟度模型
GJB 5000B-2021 军用软件能力成熟度模型