UnimportantView: Film & TV(Anime) Works Rating

如何评价影视剧(动漫作品)

我一向的观点是现实生活已经投入了很多时间体验了,影视剧(动漫作品)肯定要是看现实中没有的。这导致的第一个问题就是既然不存在,你怎么让观众相信呢?

  • 真实的氛围感
    • 真实的细节特效
    • 真实的演员反映和期望中的样子

如何评价对影视剧(动漫作品)角色的喜爱程度

  • 喜欢一个角色往往是没有什么理由的,虽然要追求格物致知。但是将最感性的情感拿来分析是不是有点无情呢?

  • 初印象的美好(40)

    • 外貌美(15):
      • 不一定要完美,但是要有特点,
      • 可以接受有缺陷,但是其一般要具有意义来完善人物塑造。
    • 可爱俏皮(5)
      • 可以拉进距离感
    • 性格好(乐观、勇敢、坚毅、聪明)(10)
      • 角色不可能不经历挫折,乐观还是要一点
      • 但是白给的老好人不行,还是要有基础原则的
      • 可以出发点很低(一开始比较恶劣,自闭),为角色后续成长留下了空间
    • 强烈独特独立的个性魅力、个人行为准则坚定(10)
      • 额外固执但是专情
      • 病娇(特别爱一个人),想守护妹妹的想法
      • 厌世,缺爱
  • 角色剧情行事逐渐展示出来的

    • 真实感(反差,与观众拉近距离) (20)
      • 平时严酷,但也会含羞
      • 总是公正,但也会偏私
    • 悲剧色彩,激发了同情心(共情)(0~30)
      • 努力却依旧失败、正义行事却危机四伏、爱而不得、无所谓付出。一哭 +10
      • 美好的东西被摧毁总是令人扼腕痛心,令人印象深刻。+10
        • 失去美好的未来
      • 刀人:刀友情,刀亲情 +10
    • 共鸣?观众随角色一同成长(40)
      • 如果观众一开始有一样的疑惑,(10)
      • 然后和角色一起寻找答案 (10)
      • 最后坚定的相信自己找到的 (20)

举例

  • 星野爱(113)
    • 外貌(5):不是特别感冒的形象
    • 可爱俏皮(2)
    • 乐观性格(6):演出也有时迷茫,却为了孩子开朗了起来
    • 独特和自我(10): 厌世,缺爱让人同情
    • 真实感(20):以谎言编织的怀孕偶像,是最大的反差
    • 悲剧色彩(30):
      • 想学会爱,但是到死还在努力
      • 失去了与孩子们的未来
      • 刀母爱
    • 共鸣与成长(40)
      • 疑惑: 不会爱的人怎么办
      • 寻找:以谎言代替
      • 结论:谎言也是我努力传达爱意的方式。但唯独我爱你们,这句话……绝对不是谎言
  • 亚斯娜(100)
    • 外貌(15):理想的人妻
    • 可爱俏皮(5)
    • 乐观性格(10):理想的姐姐人妻性格,爱你管你又不太束缚你
    • 独特和自我(10): 为了Kirito 愿意牺牲自己
    • 真实感(20):平时严酷,但也会含羞
    • 悲剧色彩(10):
      • 刀爱情, 差一点失去Kirito
    • 共鸣与成长(30)
      • 疑惑: 在虚拟世界里,存在的意义是什么
      • 寻找:寻找虚拟世界“红莫罗”的东西
      • 结论:这份感情与相遇的经历是真实的(10,结论不够动容)
  • 爱莉希雅Elysia(125)
    • 外貌(15):理想的人妻2
    • 可爱俏皮(10) 与芽衣打情骂俏,甜齁了(摸角)。额外加分+5
    • 乐观性格(10):理想的姐姐人妻性格,
    • 独特和自我(10): 真我 ~ 人之律者
    • 真实感(20):平时严酷,但也会含羞(神之子却爱上了人类)
    • 悲剧色彩(30):
      • 出生无知的律者,努力爱人类,却不被理解
      • 反而为人类牺牲
      • 本世代对抗侵蚀之律者,最终数据还被删除
    • 共鸣与成长(30)
      • 疑惑: 凡事任凭心意而为,自由自在,与副首领的身份格格不入的往事乐土的少女是谁
      • 寻找:寻找前世的真相与少女的秘密
      • 结论:即使往事乐土不存在了,但只要这份记忆还在,你就永远还在。愿时光永驻此刻(10,结论不够动容)
  • 光与焰(120)
    • 外貌(15):两个人各有特点
    • 可爱俏皮(5)
    • 乐观性格(10):理想的姐姐人妻性格,
    • 独特和自我(10): 光傲娇 焰体贴
    • 真实感(25):光性格上与焰完全相反,非常要强,不擅长表达自己的感情,但本性其实很温柔,内心很脆弱。
      • 高质量CG的游戏,真实沉浸感额外加分+5
    • 悲剧色彩(20):
      • 被坏人利用,虽然不愿意,但是伤害了世界,
      • 喜欢lex,最后还是牺牲了自己(lex,你一个人也没关系了吧!)
    • 共鸣与成长(35)
      • 疑惑: 无意间结实的少女
      • 寻找:寻找世界的真相与少女的秘密
      • 结论:即使有前世的经历。但是愿意忘记悲伤的过去。从现在开始彼此守护(15,结论不够动容)
  • 评价模板
    • 外貌(15):理想的人妻
    • 可爱俏皮(5)
    • 乐观性格(10):理想的人妻性格
    • 独特和自我(10):
    • 真实感(20):
    • 悲剧色彩(30):
      • 失去了
    • 共鸣与成长(40)
      • 疑惑:
      • 寻找:
      • 结论:

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

看了星野爱之后,我又emo了

参考文献

Gem5

简介

  • GEM5是一款模块化的离散事件驱动全系统模拟器,由C++与python编写
  • 它结合了M5(多处理器模拟器)和GEMS(存储层次模拟器)中最优秀的部分,是一款高度可配置、集成多种ISA和多种CPU模型的体系结构模拟器。
    • M5是由Michigan大学开发的一款开源的多处理机模拟器,受到了业内的广泛关注,很多高水平论文都采用M5作为研究工具。
    • 另一方面,Wisconsin推出的GEMS能够对储存层次进行详细而灵活的模拟,包括对多种不同的cache一致性协议和互联模型的支持。
    • 目前的GEM5是M5和GEMS的一个紧耦合版本。
  • GEM5已经能够支持多种商用ISA,包括X86、ARM、ALPHA、MIPS、Power、SPARC等,并且能够在X86、ARM、ALPHA上加载操作系统。

可选配置(灵活性)

  • 灵活性是指gem5提供了多种CPU模型、系统模型以及存储器模型。
    • CPU模型:Atomic、Timing、In-order、O3(Out of Order)
      • AtomicSimple是最简单规模的模型,一个cycle完成一条指令的执行,memory 模型比较理想化,访存操作为原子性操作。适用于快速功能模拟。
      • TimingSimple模拟器也是无流水线的模拟,但是使用了存储器访问时序模型,用以统计存储器访问延迟。
      • In-Order模型是GEM5模拟的新特性,强调指令时序与仿真精度,流水级为默认五级流水:取值、译码、执行、访存、写回。并且模拟了cache部件、执行部件、分支预测部件等。
      • O3模拟器是流水级模拟,O3模拟器模拟了乱序执行和超标量执行的指令间依赖,以及运行在多CPU上的并发执行的多线程。
        • 默认7级流水:取值、译码、重命名、发射、执行、写回、提交。
        • 模拟了物理寄存器文件、IO、LSQ、ROB功能部件池等。
        • 主要参数为流水管道间延迟、硬件线程数、IQ/LSQ/ROB项数、FU延迟、物理寄存器重命名、分支预测、访存依赖预测等。
    • 系统模型:SE(System-call emulation)、FS(Full System)。
    • 存储模型:Classic、Ruby。
      • M5的Classic mode存储器是最简单的模型,它提供了简洁快速的可配置性。
      • GEMS的Ruby模型注重于精确度并且支持不同的cache一致性协议。
        • Ruby存储模型支持庞大阵列的互联拓扑,包括两个不同的网络模型:Simple网络与Garnet网络。
          • Simple网络对链路、路由延迟与链路带宽进行建模,但并不建模路由资源竞争与流控。
          • Garnet网络详细建模路由微架构,包括所有相关的资源竞争与流控时序。

基本模式

  • System Call Emulation (SE) Mode
    • In this mode, one only needs to specify the binary file to be simulated. This binary file can be statically/dynamically linked.
  • full-system mode
    • This mode simulates a complete system which provides an operating system based simulation environment.
    • very slow, rendering it impractical for deployment in real-world applications.
1
time ./build/ARM/gem5.fast configs/example/se.py --cmd=/home/shaojiemike/test/llvmVSgem5/MV/MV_gem5 -n 32 --cpu-type=O3CPU --l1d_size=64kB --l1i_size=16kB --caches
  • L1d cache是每个核单独64KB(原因见后图)。但其实默认cache结构是L2共享的

安装

  • 在源目录下运行scons build/<config>/<binary> 建立模拟器。
    • <config> gem5的配置文件,如ARMX86
    • <binary> 模拟器的类型,有如下
      • gem5.debug 有关闭了优化,使gdb一类的工具更易于调试;
      • gem5.opt有打开优化,但保留了调试输出和断言;
      • gem5.fast去除了调试工具;
      • gem5.prof用于与gprof共同使用
1
scons build/ARM/gem5.fast --debug=presub --verbose -j 32

输入参数

gem5 安装的默认配置

可选选项在./build/ARM/gem5.fast configs/example/se.py -h或者 configs/common/Options.py 中查看

常规的配置:

  • 多级cache
  • CPU
    • 频率,核数
    • 指令发射宽度
      • commitWidth, decodeWidth, dispatchWidth, fetchWidth, issueWidth,
      • renameWidth, squashWidth, wbWidth ,
    • 端口模型的部件类型以及个数
  • 内存

cache設置

  • 只指定大小是沒用的,需要在L1cache 前加上 “–caches”,在l2cache前加上 “–l2cache“。命令結果類似
  • 默认cache是没有开硬件预取HWP的,类型通过--list-hwp-types查看。可以指定L1L2cache的HWP类型,如--l1d-hwp-type=TaggedPrefetcher
1
2
3
4
5
6
7
8
9
10
11
build/X86/gem5.opt configs/example/se.py 
--caches --l1d_size=32kB --l1i_size=32kB
--l2cache --l2_size=256kB
--l3_size=8192kB # l3 在 se里是不生效的
-c tests/test-progs/hello/bin/x86/linux/hello

# 建议将L3大小并入L2来模拟cycle的下限
build/X86/gem5.opt configs/example/se.py
--caches --l1d_size=32kB --l1i_size=32kB
--l2cache --l2_size=256kB+8192kB
-c tests/test-progs/hello/bin/x86/linux/hello

进阶配置:

  1. 多核模拟时,配置独占cache
  2. 增加共享L3
  3. 添加共享的L3cache,并将L2cache改为独立的

输出文件

运行完SE模式,默认会在指令路径下生成m5out文件夹,其中各文件大致含义如下:

  • config.ini或者config.json 运行指令的系统参数
    • Contains a list of every SimObject created for the simulation and the values for its parameters.
    • json格式的文件能比较好的理清config的重要设置
    • [system.cpu] 有CPU的具体设置
    • [system.mem_ctrls.dram] 有DRAM读取数据的具体设置
    • [system.membus] BUS的相关设置
  • stats.txt 模拟结果数据(具体的周期数等)
    • A text representation of all of the gem5 statistics registered for the simulation.
    • system.clk_domain.clock 1000 # Clock period in ticks (Tick)
    • system.cpu_clk_domain.clock 500 # Clock period in ticks (Tick)
  • fs/proc/lscpu 模拟系统配置(类似lscpu)
  • config.dot.* 模拟的系统结构
    • config.dot 是以文字展示
    • config.dot.pdfconfig.dot.svg 都是以图片表示aliyuncs1
    • config.dot.svg 能展示每个部件的细节参数 aliyuncs2

运行

参考博客, 如果se.py無法滿足要求,可以自己編寫脚本

CPU参数解释

各阶段发射宽度

commitWidth, decodeWidth, dispatchWidth, fetchWidth, issueWidth, renameWidth, squashWidth, wbWidth

下面是行数占比最大的几个部分

branchPred

  • BTBEntries

decoder

fuPool

  • fuction pool 类似乱序执行的端口模型,ARM下的O3模拟的fuPool如下
    ARM-O3-fuPool

gem5 模拟器误差来源分析

运行真实周期数

  • 使用perf stat test.exe, 可参考本博客perf文章

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/ivy_reny/category_6666068.html

https://blog.csdn.net/wyj7260/category_1301132.html

Synology terminal

配置开机启动项

编写脚本/var/services/homes/shaojiemike/wgReboot.sh

1
2
3
4
5
#!/bin/bash
ip ro add default via 222.195.90.254 dev eth0 table eth0-table
ip ro a 114.214.233.0/24 via 222.195.90.254 dev eth0 src 222.195.90.2 table main
wg-quick up wg1
ip ro d default via 222.195.90.254 dev eth0 src 222.195.90.2 table main
  • 执行权限chmod +x
  • 群晖WebUI -> 控制面板 -> 任务计划 -> 新增 -> 触发的任务
    • 选择Root、开机事件
    • bash /var/services/homes/shaojiemike/wgReboot.sh

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

Reboot Task

最简单/etc/rc.lo­cal

默认是不开启的,文件/etc/rc.lo­cal默认也不存在

开启/etc/rc.lo­cal功能

  • ubuntu18.04不再使用initd管理系统,改用systemd
  • systemd有rc-local的配置文件,只需链接到/etc/systemd/system目录下启动即可
    • ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

使用/etc/rc.lo­cal功能

1
2
3
4
touch /etc/rc.local
chmod 755 /etc/rc.local
vim /etc/rc.local
eg. #!/bin/bash echo "test rc " > /var/test.log

crontab @reboot

1
2
crontab -e
@reboot /home/user/test.sh

initd 启动管理系统

  • init.d目录包含许多系统各种服务的启动和停止脚本。它控制着所有从acpid到x11-common的各种事务。
  • 注意:ubuntu18.04不再使用initd管理系统,改用systemd

编写脚本

  • /etc/init.d目录下建立文件test
    • 按照README编写脚本
    • 赋予执行权限sudo chmod +x /etc/init.d/test

设置脚本启动

方法一:使用update-rc.d 命令将脚本放到启动脚本中去(debian中可以使用更新的insserv):

1
2
$ cd /etc/init.d
$ sudo update-rc.d test defaults 95

注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。更多说明建议看man update-rc.d。

方法二:手动在rc*.d中建立软连接

1
$ ls -s test ../rc5.d/S95test

rc*.d,*代表启动级别,在不同启动级别启动,
K开头的脚本文件代表运行级别加载时需要关闭的,
S开头的代表相应级别启动时需要执行,
数字代表顺序

卸载启动脚本的方法:

1
2
$ cd /etc/init.d
$ sudo update-rc.d -f test remove

手动调用脚本

1
2
3
/etc/init.d/test start
/etc/init.d/test stop
/etc/init.d/test restart

systemd 服务管理系统

使用sudo systemctl enable xxx

1
2
3
4
5
6
7
8
9
systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable *.service #开机运行服务
systemctl disable *.service #取消开机运行
systemctl start *.service #启动服务
systemctl stop *.service #停止服务
systemctl restart *.service #重启服务
systemctl reload *.service #重新加载服务配置文件
systemctl status *.service #查询服务运行状态
systemctl --failed #显示启动失败的服务

systemctl 开机启动原理

  • Systemd 默认从目录/etc/systemd/system/读取配置文件。
  • 但是,里面存放的大部分文件都是符号链接,指向目录
    • /usr/lib/systemd/system/,真正的配置文件存放在那个目录。

systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

1
2
3
4
> $ sudo systemctl enable [email protected]
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/[email protected]' '/etc/systemd/system/multi-user.target.wants/[email protected]'
>
  • 如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。
  • 与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。
    1
    2
    > $ sudo systemctl disable [email protected]
    >
  • 配置文件的后缀名,就是该 Unit 的种类,比如sshd.socket
    • 如果省略,Systemd 默认后缀名为.service,所以sshd会被理解成sshd.service

把程序设置systemctl服务,并开机启动

进入目录/usr/lib/systemd/system,修改webhook.service

1
2
3
4
5
6
7
8
9
[Unit]
Description=Webhook receiver for GitHub

[Service]
Type=simple
ExecStart=/usr/local/bin/webhook

[Install]
WantedBy=multi-user.target

这里有几个模块:

  • [Unit] 区块:启动顺序与依赖关系。
  • [Service] 区块:启动行为,如何启动,启动类型。
  • [Install] 区块,定义如何安装这个配置文件,即怎样做到开机启动。
1
2
systemctl start nexus.service  #启动服务
systemctl enable nexus.service #设置开机启动

Loaded: loaded (/etc/systemd/system/webhook.service; enabled;这个enabled就是开机启动的意思

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://neucrack.com/p/91

OpenWRT on router

OpenWRT Installation on router

原理

原理在路由器的两个flash(firmware和firmware1)的两个系统里,写入一个支持图形化OpenWRT的新系统

查看路由器型号是否支持

查看系统型号[^1]:路由器默认是魔改的openwrt的系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@XiaoQiang:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="18.06-SNAPSHOT"
ID="openwrt"
ID_LIKE="lede openwrt"
PRETTY_NAME="OpenWrt 18.06-SNAPSHOT"
VERSION_ID="18.06-snapshot"
HOME_URL="http://openwrt.org/"
BUG_URL="http://bugs.openwrt.org/"
SUPPORT_URL="http://forum.lede-project.org/"
BUILD_ID="unknown"
LEDE_BOARD="mediatek/mt7622"
LEDE_ARCH="aarch64_cortex-a53_neon-vfpv4"
LEDE_TAINTS="no-all glibc busybox"
LEDE_DEVICE_MANUFACTURER="OpenWrt"
LEDE_DEVICE_MANUFACTURER_URL="http://openwrt.org/"
LEDE_DEVICE_PRODUCT="Generic"
LEDE_DEVICE_REVISION="v0"
LEDE_RELEASE="OpenWrt 18.06-SNAPSHOT unknown"

刷入OpenWRT后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@ax6s:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="22.03.2"
ID="openwrt"
ID_LIKE="lede openwrt"
PRETTY_NAME="OpenWrt 22.03.2"
VERSION_ID="22.03.2"
HOME_URL="https://openwrt.org/"
BUG_URL="https://bugs.openwrt.org/"
SUPPORT_URL="https://forum.openwrt.org/"
BUILD_ID="r19803-9a599fee93"
OPENWRT_BOARD="mediatek/mt7622"
OPENWRT_ARCH="aarch64_cortex-a53"
OPENWRT_TAINTS=""
OPENWRT_DEVICE_MANUFACTURER="OpenWrt"
OPENWRT_DEVICE_MANUFACTURER_URL="https://openwrt.org/"
OPENWRT_DEVICE_PRODUCT="Generic"
OPENWRT_DEVICE_REVISION="v0"
OPENWRT_RELEASE="OpenWrt 22.03.2 r19803-9a599fee93"

路由器开启dropbear

dropbear 是一种轻量级sshd服务

1
2
3
nvram set ssh_en=1  # 不是1也退出1
/etc/init.d/dropbear start # 脚本start段里增加了判断,稳定版不让启动直接退出
netstat -n # 查看22端口

修改/etc/dropbear/authorized_keys 来添加ssh公钥

Redmi-Ax6s实操

参考教程,和具体的视频

Step2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python3
import sys
import hashlib

if sys.version_info < (3,7):
print("python version is not supported", file=sys.stderr)
sys.exit(1)

# credit goes to zhoujiazhao:
# https://blog.csdn.net/zhoujiazhao/article/details/102578244

salt = {'r1d': 'A2E371B0-B34B-48A5-8C40-A7133F3B5D88',
'others': 'd44fb0960aa0-a5e6-4a30-250f-6d2df50a'}


def get_salt(sn):
if "/" not in sn:
return salt["r1d"]

return "-".join(reversed(salt["others"].split("-")))


def calc_passwd(sn):
passwd = sn + get_salt(sn)
m = hashlib.md5(passwd.encode())
return m.hexdigest()[:8]


if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} <S/N>")
sys.exit(1)

serial = sys.argv[1]
print(calc_passwd(serial))

Step3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
XiaoQiang login: root
Password:


BusyBox v1.25.1 (2021-10-25 11:02:56 UTC) built-in shell (ash)

-----------------------------------------------------
Welcome to XiaoQiang!
-----------------------------------------------------
$$$$$$\ $$$$$$$\ $$$$$$$$\ $$\ $$\ $$$$$$\ $$\ $$\
$$ __$$\ $$ __$$\ $$ _____| $$ | $$ | $$ __$$\ $$ | $$ |
$$ / $$ |$$ | $$ |$$ | $$ | $$ | $$ / $$ |$$ |$$ /
$$$$$$$$ |$$$$$$$ |$$$$$\ $$ | $$ | $$ | $$ |$$$$$ /
$$ __$$ |$$ __$$< $$ __| $$ | $$ | $$ | $$ |$$ $$<
$$ | $$ |$$ | $$ |$$ | $$ | $$ | $$ | $$ |$$ |\$$\
$$ | $$ |$$ | $$ |$$$$$$$$\ $$$$$$$$$ | $$$$$$ |$$ | \$$\
\__| \__|\__| \__|\________| \_________/ \______/ \__| \__|


root@XiaoQiang:~# ls

Step4

  1. 通过cat /proc/mtd,知道对应关系

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    root@XiaoQiang:/tmp# cat /proc/mtd
    dev: size erasesize name
    mtd0: 07f80000 00020000 "ALL"
    mtd1: 00080000 00020000 "Bootloader"
    mtd2: 00040000 00020000 "Config"
    mtd3: 00040000 00020000 "Bdata"
    mtd4: 00040000 00020000 "Factory"
    mtd5: 00040000 00020000 "crash"
    mtd6: 00040000 00020000 "crash_syslog"
    mtd7: 00040000 00020000 "cfg_bak"
    mtd8: 00400000 00020000 "kernel0"
    mtd9: 00400000 00020000 "kernel1"
    mtd10: 01a00000 00020000 "rootfs0"
    mtd11: 01a00000 00020000 "rootfs1"
    mtd12: 02600000 00020000 "overlay"
    mtd13: 01b80000 00020000 "obr"
    mtd14: 00c1c000 0001f000 "ubi_rootfs"
    mtd15: 021e8000 0001f000 "data"
  2. 备份,其中Factory中存储了EEPROM的数据

    1
    2
    3
    4
    5
    6
    cat /dev/mtd4 > Factory.dump
    cat /dev/mtd3 > Bdata.dump

    #on windows
    scp [email protected]:/tmp/factory.bin .
    scp [email protected]:/tmp/factory.bin .

Step5

  1. 路由器ssh终端,配置环境变量

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # nvram写入flash
    # Enable uart and boot_wait, useful for testing or recovery if you have an uart adapter!
    nvram set ssh_en=1
    # 设置串口打开,以便ssh失败时,硬件debug
    nvram set uart_en=1
    nvram set boot_wait=on

    # Set kernel1 as the booting kernel
    nvram set flag_boot_success=1
    nvram set flag_try_sys1_failed=0
    nvram set flag_try_sys2_failed=0

    # Commit our nvram changes
    nvram commit
  2. 电脑本地准备传输可执行文件(开启了ssh服务,直接scp传上去即可)

    1. Rename the file openwrt-mediatek-mt7622-xiaomi_redmi-router-ax6s-squashfs-factory.bin you previously downloaded to your computer to factory.bin
    2. in the same directory where the file factory.bin is located, run the following command python -m http.server
  3. 路由器ssh终端,配置环境变量接受并运行

    1
    2
    3
    cd /tmp
    wget http://<IP address of your computer>:8000/factory.bin
    mtd -r write factory.bin firmware
  4. 完成后重启,默认ip变成192.168.1.1

  5. 失败加上nvram set "boot_fw1=run boot_rd_img;bootm" 重来

WireGuard Server in OpenWRT

OpenWRT换软件安装源

修改/etc/opkg/distfeeds.conf的配置,参考

下面为x86软路由的源(由于是snapshot的安装不了,内核不匹配),如果是arm的需要看对应架构代号。

1
2
3
4
5
6
src/gz openwrt_core https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/targets/x86/64/packages
src/gz openwrt_base https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/base
src/gz openwrt_luci https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/luci
src/gz openwrt_packages https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/packages
src/gz openwrt_routing https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/routing
src/gz openwrt_telephony https://mirrors.ustc.edu.cn/openwrt/releases/22.03.3/packages/x86_64/telephony

比如ax6s

1
2
3
4
5
6
7
[root@ax6s ~]$ cat /etc/opkg/distfeeds.conf
src/gz openwrt_core https://downloads.openwrt.org/releases/22.03.2/targets/mediatek/mt7622/packages
src/gz openwrt_base https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/base
src/gz openwrt_luci https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/luci
src/gz openwrt_packages https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/packages
src/gz openwrt_routing https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/routing
src/gz openwrt_telephony https://downloads.openwrt.org/releases/22.03.2/packages/aarch64_cortex-a53/telephony

可以通过cat /etc/os-release查看, 上面的如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@OpenWrt:~# cat /etc/os-release
NAME="OpenWrt"
VERSION="SNAPSHOT" # snapshot是开发版的意思
PRETTY_NAME="OpenWrt SNAPSHOT"
VERSION_ID="snapshot"
BUILD_ID="r5636-25f88e06f"
OPENWRT_BOARD="x86/64"
OPENWRT_ARCH="x86_64"

[root@ax6s ~]$ cat /etc/os-release
NAME="OpenWrt"
VERSION="22.03.2"
PRETTY_NAME="OpenWrt 22.03.2"
VERSION_ID="22.03.2"
BUILD_ID="r19803-9a599fee93"
OPENWRT_BOARD="mediatek/mt7622"
OPENWRT_ARCH="aarch64_cortex-a53"

WireGuard安装服务端程序

  1. eSir精品小包固件下载地址(感谢esir的辛勤付出)

    1. 内置了wireguard(使用对等节点的公私钥加密)
  2. OpenWrt安装WireGuard命令(eSir精品小包已集成WireGuard,无需安装)

    1
    2
    3
    4
    5
    6
    opkg update
    opkg install luci-proto-wireguard luci-app-wireguard wireguard kmod-wireguard wireguard-tools
    reboot

    # x86
    opkg install wireguard luci-app-wireguard luci-i18n-wireguard-zh-cn wireguard-tools

WireGuard服务端设置

具体步骤

  1. 配置WG服务器端公私钥
  2. OpenWrt的luci界面配置服务器节点
  3. OpenWrt-网络-防火墙设置
    1. 如果OpenWrt做主路由,还需要在防火墙->通信规则中开放端口
    2. 假如是旁路由,需要设置端口转发
  4. 为每个客户端节点创建密钥
  5. OpenWrt->网络->接口,修改原本的WG0设置。修改Peers
    1. 左下角更多选项选择预共享密钥,添加
    2. 由于不能同时用,所以每个机器要单独配置,不能公用

WireGuard客户端设置

客户端模板文件test.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Interface]
Address = 192.168.100.2 约定的IP
PrivateKey = cprivatekey文件内容
DNS = 路由器IP


[Peer]
PublicKey = spublickey文件内容

AllowedIPs = 0.0.0.0/0
//上面代表所有流量走WG。如果启用下面这行代码,表示只有192.168.2.0/24, 192.168.100.0/24这两个子网的IP走WireGuard
//逗号前是家庭局域网的IP段,后面是VPN的IP段
//AllowedIPs = 192.168.2.0/24, 192.168.100.0/24

PresharedKey=sharedkey内容
Endpoint = 公网IP(动态域名):端口号
PersistentKeepalive = 25

WireGuard配置匹配一览图

"[Interface] Address" is the address that gets assigned to the (virtual) network interface (e.g. wg0).
简单来说客户端和服务器端约定的相同的虚拟地址来通信。

注意防火墙放行端口

官方客户端软件下载

WireGuard常见问题

注意:如果连接不上

  1. 首先保证路由器有网,不是路由器下的电脑有网
    1. 上次师兄的电脑开了OpenVPN上网,导致路由器ipv6能ping通,但是不能上网
  2. 注意防火墙,一个是wan口允许某几个端口进来(wg连接请求)。另一个是wan能到wg,wg也能到wan,才能实现上网
    1. 至于和lan的关系,如果需要通过wg访问lan口下的设备(nas,电脑)再打开即可。

Clash in OpenWrt

  • 安装版本来自github
  • 但是由于DDNS会出问题,所以关闭了。(可以考虑2次wireguard蹭网和clash for linux)
  • BT,PT有时也会被代理,需要注意。

安装编译好的 IPK 文件(openwrt 的软件包)

安装依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
#iptables
opkg update
opkg install coreutils-nohup bash iptables dnsmasq-full curl ca-certificates ipset ip-full iptables-mod-tproxy iptables-mod-extra libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base

#nftables
opkg update
opkg install kmod-nft-tproxy

wget https://github.com/vernesong/OpenClash/releases/download/v0.45.59-beta/luci-app-openclash_0.45.59-beta_all.ipk
root@ax6s:/tmp# opkg install luci.ipk
Installing luci-app-openclash (0.45.59-beta) to root...
Configuring luci-app-openclash.
cfg117882

重启后出现

注意不会代理ping,所以ping不通的话,可以用curl来测试代理是否生效。https失败可以尝试http

安装问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Collected errors:
* check_data_file_clashes: Package dnsmasq-full wants to install file /etc/hotplug.d/ntp/25-dnsmasqsec
But that file is already provided by package * dnsmasq
* check_data_file_clashes: Package dnsmasq-full wants to install file /etc/init.d/dnsmasq
But that file is already provided by package * dnsmasq
* check_data_file_clashes: Package dnsmasq-full wants to install file /usr/lib/dnsmasq/dhcp-script.sh
But that file is already provided by package * dnsmasq
* check_data_file_clashes: Package dnsmasq-full wants to install file /usr/sbin/dnsmasq
But that file is already provided by package * dnsmasq
* check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/acl.d/dnsmasq_acl.json
But that file is already provided by package * dnsmasq
* check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/dnsmasq/dhcpbogushostname.conf
But that file is already provided by package * dnsmasq
* check_data_file_clashes: Package dnsmasq-full wants to install file /usr/share/dnsmasq/rfc6761.conf
But that file is already provided by package * dnsmasq
* opkg_install_cmd: Cannot install package luci-app-openclash.

解决办法如下

1
2
opkg update
opkg remove dnsmasq && opkg install dnsmasq-full

DDNS in OpenWRT

DDNS简介

Dynamic DNS: 根據網際網路的域名訂立規則,域名必須跟從固定的IP位址。但動態DNS系統為動態網域提供一個固定的名稱伺服器(Name server),透過即時更新,使外界使用者能夠連上動態使用者的網址。

cloudflare动态域名 或者阿里云动态域名的DDNS都是很好的选择。

定时脚本实现DDNS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@ax6s ~]$ cat ddns.sh
#!/bin/bash

Network=wan@eth0

Date=`echo $'\n\n' >> /tmp/ddns_ipv4`
Date=`echo "$(date)" >> /tmp/ddns_ipv4`
IPv4=`ip a|grep -A 2 ${Network}|sed -n '3p'|awk '{print $2}' |sed -e 's/\/[0-9]*//'`
echo $IPv4 >> /tmp/ddns_ipv4
IPv6=`ip a|grep -A 4 ${Network}|sed -n '5p'|awk '{print $2}' |sed -e 's/\/[0-9]*//'`
echo $IPv6 >> /tmp/ddns_ipv4

curl -v http://v6.sync.afraid.org/u/4TY5…………tKF/?address=${IPv6} 2>&1 >> /tmp/ddns_ipv4
curl -v http://sync.afraid.org/u/M8uh9Zf…………ryjxs/?address=${IPv4} 2>&1 >> /tmp/ddns_ipv4

修改crontab -e

1
2
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
4,9,14,19,24,29,34,39,44,49,54,59 * * * * sleep 11 ; /root/ddns.sh

OpenWRT 为局域网设备设置IPv6 DDNS

脚本围绕,打印邻居路由表命令

1
2
3
4
5
6
[root@ax6s ~]$ ip -6 neigh | grep 2c:f0:5d
2001:da8:d800:611:1818:61b6:6422:56a1 dev br-lan lladdr 2c:f0:5d:ac:1d:2c DELAY
2001:da8:d800:611:5464:f7ab:9560:a646 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE
2001:da8:d800:611:4d13:ead8:9aaf:bfc4 dev br-lan lladdr 2c:f0:5d:ac:1d:2c REACHABLE
2001:da8:d800:611:a063:863f:caa3:4a73 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE
2001:da8:d800:611:8c75:4f49:f9d0:42b6 dev br-lan lladdr 2c:f0:5d:ac:1d:2c STALE

新建 /usr/lib/ddns/dynamic_dns_iphelper.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh

get_ip(){
MAC=$1
if [ "$MAC" = "" ]
then
exit 0
fi
IP=$(ip -6 neigh | grep -i $MAC | grep -v "fe80:" | grep -E "REACHABLE|STALE" | cut -d" " -f1 | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){8}")
if [ "$IP" = "" ]
then
IP=$(mac_to_ipv6_ll $MAC $(get_ip_prefix))
fi
echo $IP
}

mac_to_ipv6_ll() {
PREFIX="fe80::"
if [ "$#" = 2 ]; then
PREFIX=$2
fi
IFS=':'; set $1; unset IFS
echo "$PREFIX$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}

get_ip_prefix() {
IP_PREFIX=$(ip -6 addr | awk '{print $2}' | grep '::1' | grep -m 1 -E -o "([0-9a-fA-F]{1,4}(:?)){4}")
echo $IP_PREFIX
}

if [ "$1" != "" ]; then
echo `get_ip $1`
fi

新建 /usr/lib/ddns/getip_demo.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 遵循 EUI-64 的设备使用这个方式 可以获取到静态后缀的IPv6地址
# 00:00:00:00:00:00修改为目标设备的MAC地址
echo $(mac_to_ipv6_ll "00:00:00:00:00:00" $(get_ip_prefix))

# 或者
#!/bin/sh

. /usr/lib/ddns/dynamic_dns_iphelper.sh
# 00:00:00:00:00:00修改为目标设备的MAC地址
# 不遵循 EUI-64 的设备 可以获取到动态IPv6地址
echo `get_ip "00:00:00:00:00:00"`

脚本chmod +x就行

School Network

  • 根据学校的网络通各个端口的说明,0号端口没有经过NAT,登录之后获得公网ipv4。但是IPv4封了许多端口(至少ssh的22端口是不行的)
  • IPv6是直接可以ssh访问的。

参考文献

https://www.youtube.com/watch?v=F8z74oE71Gg&t=19s

https://xiumu.org/technology/openwrt-set-for-local-area-network-lan-equipment-ipv6-ddns.shtml

OpenWRTNetworkManage

2
觉得有意义写,先占个位子

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

Webdav

简介

Webdav

WebDAV由互联网工程任务组的工作组在RFC 4918中定义。是基于Web的分布式编写和版本控制(WebDAV)是超文本传输协议(HTTP)的扩展,

WebDAV协议为用户在服务器上创建,更改和移动文档提供了一个框架。有利于用户间协同编辑和管理存储在万维网服务器文档。

WebDAV协议最重要的功能包括:

  • 维护作者或修改日期的属性、名字空间管理、集合和覆盖保护。

  • 维护属性包括创建、删除和查询文件信息等。

  • 名字空间管理处理在服务器名称空间内复制和移动网页的能力。

  • 集合(Collections)处理各种资源的创建、删除和列举。

  • 覆盖保护处理与锁定文件相关的方面。

  • 可以使用https来保证安全

Samba / CIFS

局域网传输,没有加密

群晖开启WebDaV

参考教程, 开启 https 5555 端口, http 5556端口

设置特殊用户keeweb来访问下载文件夹keeweb下内容。如https://10.0.233.3:5555/keeweb/1.txt

windows挂载

安装RaiDrive

测速

大文件

在1.63GB大文件的时候,SMB能稳定的跑满千兆全速

2M中文件

首先通过split来拆分文件来测试

1
split -b 2M 1.mkv split.mkv

在2M的时候,WebDav有些许优势

4K小碎片

在4K的时候,WebDav较大优势

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

  1. 网上有传言 WebDav 比 SMB快 8~9倍,但是有人质疑是缓存的原因
  2. keepass同步可以通过坚果云的WebDav

参考文献

https://www.rmnof.com/article/better-ways-to-use-webdav/

IPV4 && IPV6

IPV4

展示了A、B、C类IP地址的二进制表示和它们的特征:

类别 地址范围 网络数 主机数 说明
A 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 1-126 2^24-2 第一位为0
B 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 128-191 2^16-2 前两位为10
C 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 192-223 2^8-2 前三位为110
D 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 224-239 不适用 用于多播
E 11110xxx.xxxxxxxx.xxxxxxxx.xxxxxxxx 240-255 不适用 保留用于实验和未来使用

在这个表格中:

  • A类地址的范围是从 0.0.0.0127.255.255.255,第一位必须是0。
  • B类地址的范围是从 128.0.0.0191.255.255.255,前两位必须是10。
  • C类地址的范围是从 192.0.0.0223.255.255.255,前三位必须是110。

D类和E类地址用于特殊用途,不用于普通的网络和主机地址分配。

拥抱ipv6

ipv6 原本是为了解决ipv4不足而提出的:

  • IPv4的地址范围是0.0.0.0~255.255.255.255,其地址总量约43亿个(2的32次方),这其中还要刨去私有网段、网络ID、广播ID、保留网段、本地环回、组播地址等特殊地址段,最终的实际可用地址约为25.68亿个,全球互联网设备数是远超这个的。所以一方面设计了私有地址来上网
  • 另一方面就是ipv6。IPv6的地址长度为128位,虽然地址长度仅仅是IPv4的4倍(IPv4是32位的),但IPv6的地址总量却达到了惊人的$2^{128}$。换一种更通俗的说法:地球上每一平方米,都可以分到10^26次方个IPv6地址,夸张一点来说,可以给每一粒尘埃都分配到一个地址。
Read more

Audio

基本的音视频编码知识

Read more

Video

视频信息软件Mediainfo

同样是1080P 25帧,码率不同,大小差异很大。

或者(有时候会失效,eg 720P)

相关概念

CRF

CRF(英文:constant ratefactor 意思:压缩质量)是动态码率,要看你拍摄的视频画面抖动切换的程度,如果比较安静就20,动的厉害就25。

crf18就接近无损,字幕组惯用20-22,crf23是默认值。 CRF的值越小,视频将会越清晰 当然视频质量就会更大。

2-pass

2-pass通过两次编码,第一次编码是先对整个文件进行扫描,记录一些统计信息,第二次编码时根据前面记录的统计信息再进行编码。这么做虽然转换时间会漫长,但压出的片子会有更好的画质,画面细节更好,而且体积会更小。

常用于非实时转码的情景。

视频压缩实践

疫情线上参会邮件投递Presentation视频,邮件大小限制100MB。PPT生成的过大

格式工厂(Format Factory)压缩

直接自定义导入导出,默认设置就行(确定分辨率不变的情况下,大小无法限制)。视频部分就只有原来五分之一(中间),而且完全看不出损失。

如果要最小大小,选择“转mp4”,然后“输出设置”选择“低质量和大小”,最后在分辨率选回原来的分辨率。

如果不熟悉H.265的参数设置,压缩后不一定比H.264小。

PS: H.264中熵编码有两种方法:

  1. 一种是对所有的待编码的符号采用统一的VLC(UVLC :Universal VLC),
  2. 另一种是采用内容自适应的二进制算术编码(CABAC:Context-Adaptive Binary Arithmetic Coding)。CABAC是可选项

CABAC动态的根据内容的码率能在效能与压缩效率上取得相当大的改善空间,但是顺序处理造成资料依存性(Data Dependency)偏高。

FFmpeg命令行

已知大小需求来计算需要压缩的码率。直接设置压缩后的平均码率就行,常见软件有:小丸工具箱,HandBrake, 剪映

首先需要知道如何计算码率


ffmpeg是一个自由软件,可以运行音频、视频多种格式的录影、转换、流功能,包含

  • libavcodec–这是一个用于多个项目中的音频、视频的解码器库,
  • libavformat–一个音频和视频格式转换库。
1
2
3
4
# 视频流码率 500k, 音频流码率 50k
ffmpeg -i huawei_report_English_video.mp4 -c:v libx264 -b:v 500k -b:a 50k out_500k.mp4
# 或者设置最大最小
ffmpeg -i huawei_report_English_video.mp4 -minrate 100K -maxrate 500K -bufsize 2000K out.mp4

结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ ls
-rw-r--r-- 1 shaojiemike staff 119M Jan 2 16:59 huawei_report_English_video.mp4
-rw-r--r-- 1 shaojiemike staff 50M Jan 2 17:23 out_500k.mp4
-rw-r--r-- 1 shaojiemike staff 24M Jan 2 17:14 out.mp4

$ ffmpeg -i out_500k.mp4 -hide_banner
Duration: 00:12:25.68, start: 0.000000, bitrate: 553 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 493 kb/s, 30.30 fps, 30.30 tbr, 30303 tbn, 60.61 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 50 kb/s (default)

# shaojiemike @ snode6 in ~/test/ffmpeg [17:14:42] C:1
$ ffmpeg -i out.mp4 -hide_banner
Duration: 00:12:25.68, start: 0.000000, bitrate: 269 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 125 kb/s, 30.30 fps, 30.30 tbr, 30303 tbn, 60.61 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 134 kb/s (default)

# shaojiemike @ snode6 in ~/test/ffmpeg [17:15:29] C:1
$ ffmpeg -i huawei_report_English_video.mp4 -hide_banner
Duration: 00:12:25.66, start: 0.000000, bitrate: 1330 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1151 kb/s, 30.30 fps, 30.30 tbr, 30303 tbn, 60 tbc (default)

视频码率(视频比特率)

同样分辨率下,视频文件的码率越大,压缩比就越小,画面质量就越高。码率越高,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。体积越大,说明压缩比小,越接近原文件。

帧率与码率的关系:帧率多,则每秒图片数目多;码率越高,每张图片质量越清晰。

码率的甜品点

VMAF - Video Multi-Method Assessment Fusion 视频多方法评估

3Mbps是1080p的甜品点。

其他标准

视频压缩编码

视频压缩原理看差评君的就懂了,讲的真好。

柴知道也行

为什么有这么多标准:

H26x的视频的编解码“贵”:

  • 视频编码由视频作者解决
  • 使用H26x标准解码价格不菲

视频编码

  我们知道,其实视频就是一帧一帧的图片。计算一下,一部25帧每秒,90分钟,分辨率为1024*768,24位真彩色的视频,没有经过压缩,大小为

1
2
3
4
1Byte(字节) = 8bit(位)
一帧大小 = 1024 * 768 * 24 = 18874368(bit) = 2359296(Byte)
总帧数 = 90 * 60 * 25 = 135000
总大小 = 一帧大小 * 总帧数 = 2359296 * 135000 = 318504960000(Byte)= 303750(MB)≈ 296(GB)

  从上面的计算可以看出,我们储存一部90分钟没压缩的电影需要296GB的,2部电影便可占满我们电脑整个硬盘。所以我们需要对视频进行压缩,这种视频压缩技术就是我们所说的编码。
  视频编码方式:H.26X(H.261、H.262、…、H.264(目前最常用)、H.265)
  音频编码方式:MP3、AAC等
  通过视频压缩算法,减少了视频文件的大小。压缩比越大,解压缩还原后播放的视频越失真,这是因为压缩的同时不可避免的丢失了视频中原来图像的数据信息。

一般ITU(国际电信联盟)和ISO(国际标准化组织)来制定

  1. ISO主导的MPEG系列: MPEG-1 用于 VCD, MPEG-2用于DVD
  2. h.26x由ITU主导,比如 H.261到H.263
  3. 两者联合制定了 H.264-H.265
    1. 各自别称 MPEG-4/AVC(Advanced Video Coding)和 MPEG-4/HEVC(High Efficiency Video Coding)

B站新支持的AOM联盟的AV1标准,免费而且没有潜在的版权问题。

画质不变时,编码标准越先进,码率越低.

相对于优酷等最高大约4000的码率,虽然B站码率低,但是以普通的动画素材为主的视频而言,因为动画以简单的单色大色块居多,一般来说1500左右的码率就足够了。

目前 AVC 依然是使用最广泛的编码标准,无论新老设备都可以播放 AVC 视频,因此保留 AVC 编码可以保证广泛的兼容性。

但是 AVC 在编码超高清视频时,输出码率较高,无法保证良好的观看体验;同时很多 AVC 解码器也不支持 HDR 和 8K 视频的解码。而 HEVC 和 AV1 对于超高清视频的压缩能力明显提升,对于 HDR 和 8K 视频的支持显著改善,因此 B 站使用更先进的编码标准为用户提供服务。

H.261的关键两原理

DCT变换

低频率部分是最重要的信息。

视频帧分类(初版)

先将视频分块,

  1. 重用不变的色块
  2. 对于平移的色块只记录移动矢量

帧间预测 & 帧内预测


关键帧I帧 与 预测帧P帧

MPEG-1

在 H.261 的基础上加入

  1. 双向预测帧B帧
    1. 更省空间,但是视频编码解码需要算力更大
  2. 帧序列的概念

BT文件命名概述

  • 标 AVC / H264 / H.264 / x264 的可以一律看作H264
  • 标 HEVC / HVC1 / H265 / H.265 / x265 的可以一律看作H265
  • GB / CHS / SC / zh-Hans 指简中
  • BIG5 / CHT / TC / zh-Hant 指繁中
  • 远离闲杂播放器,拥抱 Potplayer / IINA / VLC / MPC-BE / MPV
  • 容器
    • mkv,mp4
    • rmvb
      • RealMedia可变比特率(RMVB)。在网速缓慢的时代,边下载边看是巨大优势
      • 缺点:rm/rmvb格式编解码都是要收费。压缩比和速度都远逊于H264
    • avi
      • AVI是英语Audio Video Interleave(“音频视频交织”或译为“音频视频交错”)的首字母缩写,由微软在1992年11月推出的一种多媒体文件格式,用于对抗苹果Quicktime的技术。 现在所说的AVI多是指一种封装格式。
      • 图像数据和声音数据是交互存放的。从尾部的索引可以索引跳到自己想放的位置。
      • AVI與MP4本身只有聲音與影像沒有字幕

文字编码

  • ANSI 编码
    • 美国国家标准学会(American National Standards Institute)的缩写
    • ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码
    • 在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
  • GB2312
    • 国家推出的常见6000汉字
  • GBK
    • 微软拓展了繁体汉字的普通技术规范,所以windows上基本都是默认GBK
  • UNICODE
    • Universal Multiple-Octet Coded Character Set 统一码,初始就25种文字
    • 采用了书写编码,导致会有长得像,但是完全不同的文字。导致很多钓鱼网站
  • UTF-8编码
    • UTF-8全称:8bit Unicode Transformation Format,8比特Unicode通用转换格式,是一种变长的编码方式。
    • 其编码中的第一个字节仍然与ASCII兼容。

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://bravoing.github.io/2020/02/14/%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E5%99%A8%E5%8E%9F%E7%90%86%E3%80%81%E5%88%86%E8%BE%A8%E7%8E%87%E3%80%81%E5%B8%A7%E7%8E%87%E3%80%81%E7%A0%81%E7%8E%87/

作者:哔哩哔哩技术 https://www.bilibili.com/read/cv16198183 出处:bilibili

https://www.youtube.com/watch?v=0LSHhatwTxM

柴知道也行

https://www.jianshu.com/p/c23f3ea5443d