JoyLau's Blog

JoyLau 的技术学习与思考

之前写过一篇 编译 LCD4Linux 增加 Image,VNC,X11 驱动 的文章,这次我把 LCD4Linux 用在了 FriendlyWrt 小主机上,配合 ax206 屏实现了一个实时监控小屏。

背景

我还有一块 ax206 小屏,480x320 分辨率,之前一直没想好怎么用。想着能不能把监控画面实时显示在小屏上,放在桌面上随时看看门口的情况。

思路

整体思路很简单:

  1. ffmpeg 从 摄像头 的 RTSP 子码流中每隔 1 秒截取一帧图片
  2. lcd4linux 的 Image Widget 加载这张图片并显示到 ax206 屏
  3. 通过 procd 服务管理,实现自动启动和异常重启

这里有个关键问题:ffmpeg 写文件和 lcd4linux 读文件如果直接操作同一个文件,会出现读写冲突导致小屏显示闪烁的问题。于是需要一个”中转”机制。

解决方案

使用两个服务:

  • cam_ffmpeg:负责从 RTSP 流截取图片到 /tmp/cam.png
  • cam_watch:监听文件变化,将图片复制到 /tmp/cam_copy.png

lcd4linux 只读取 /tmp/cam_copy.png,避免了读写冲突。

阅读全文 »

背景

特斯拉为了驾驶安全,一旦挂入 D 档后,车载浏览器中的所有 <video> 标签都会被强制终止,WebRTC 方案也不可行。

但是,浏览器渲染图片和播放音频是不受限制的。

于是想到一个曲线救国的方案:用 ffmpeg 实时转码视频为 JPEG 图片流,浏览器不断渲染图片,同时单独转码音频流供浏览器播放

实现思路

1
2
3
4
5
6
7
8
9
10
特斯拉浏览器
GET /watch?url=https://youtube.com/watch?v=xxx

[服务端]
yt-dlp 获取视频源
│ pipe
ffmpeg stdin
├──► JPEG frames → multipart/x-mixed-replace → 浏览器 <img> 标签渲染

└──► MP3 audio stream → 浏览器 <audio> 标签播放

实现效果

阅读全文 »

情况说明

jenkins checkout scm 会导致处于“分离头指针”状态,继而 springboot 的 Git-Commit-Id-Plugin插件生成的 git.properties 的分支名称为提交的hash 值
Jenkins 在 Pipeline 里执行 checkout scm, 它 checkout 的不是 origin/main、origin/dev,而是一个 具体提交的 hash
Git 就进入了 Detached HEAD(分离头指针) 状态

解决思路

不要让构建时的 Git 仓库处于 detached HEAD 状态
或者显式告诉插件当前分支是谁
不用改 git-commit-id-plugin 插件的配置

阅读全文 »

在使用 OpenVPN 进行异地互联的场景中,经常会遇到这样的需求:

OpenVPN 的客户端 A(192.168.250.5)需要访问客户端 B 所在的其他子网(如 26.64.10.x)。

OpenVPN 本身的虚拟网段为:

1
192.168.250.0/24

但客户端 B 还连接着一个生产网络:

阅读全文 »

在实际开发中,我们经常需要只部署多模块项目中的特定模块。以下是几种实用的 Maven 部署技巧:

阅读全文 »

我的 Jenkins 是使用 Docker 部署的,部署的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
services:
jenkins:
image: 192.168.1.231:6117/jenkins/jenkins:2.531-jdk21
container_name: jenkins
restart: always
volumes:
- ./data:/var/jenkins_home
ports:
- 6108:8080
#- 50000:50000

升级步骤

总体思路

  1. 直接从 docker hub 上找最新的镜像包,更改 image 的 jenkins 版本重启升级即可
阅读全文 »

按内存占用统计容器

1
2
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}" | sort -k2 -h -r

统计所有容器内存占用总和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker stats --no-stream --format "{{.MemUsage}}" | \
awk '{
split($1, a, "/"); # 分割 "100MiB / 2GiB" 这样的字符串
mem = a[1]; # 提取第一部分(实际使用量)

if (mem ~ /GiB/) {
gsub(/GiB/, "", mem);
sum += mem;
} else if (mem ~ /MiB/) {
gsub(/MiB/, "", mem);
sum += mem / 1024; # 1 GiB = 1024 MiB
} else if (mem ~ /KiB/) {
gsub(/KiB/, "", mem);
sum += mem / (1024 * 1024); # 1 GiB = 1024 * 1024 KiB
} else if (mem ~ /B/) {
gsub(/B/, "", mem);
sum += mem / (1024 * 1024 * 1024); # 1 GiB = 1024^3 B
}
}
END {
printf "Total Memory Usage: %.2f GiB\n", sum
}'

阅读全文 »
0%