第 118 / 120 课 · 隔离与综合工程案例。返回课程合集。
机制与资源关系
视频流的用户体验由采集到呈现的年龄决定,网络吞吐足够也可能积压旧帧。编码重排、socket 缓冲、接收队列和显示缓存都贡献延迟,丢帧策略还应符合编码依赖。
实际用法与观察入口
以下是操作说明;先确认执行环境、工具帮助和目标对象。设备名、PID、地址及项目名示例需要按实际替换,不能将整段命令当通用板端脚本执行。
|
输出解读与排查顺序
同一时钟域下记录分段时间,跨设备先校准或估计偏差。不要任意丢压缩码流中的包或帧,可能破坏解码依赖;应在合适边界设计恢复和关键帧策略。
情境推演
视频看起来流畅但控制跟随慢,可能一直在播放旧帧。将最新帧时间与当前时间比较,注意时钟同步;流畅度和实时性是两个验收指标。
练习与参考分析
运行构造时序分析,比较处理时间和结果年龄。参考结论:若计算稳定但年龄持续增加,应优先查积压;盲目增加接收缓存会使延迟更大。
独立实验包
Python 3.10+ 标准库;构造时间线,不代表网络或 NPU 实测。 默认入口、源文件和实际运行记录都在下载包中。
实验:案例:网络视频卡顿与帧龄
查看完整代码:main.py
import json
from pathlib import Path
rows = json.loads(Path(__file__).with_name("timeline.json").read_text())
ages = []
for row in rows:
capture, start, finish, present = (
row[k] for k in ("capture_ms", "start_ms", "finish_ms", "present_ms")
)
if not capture <= start <= finish <= present:
raise ValueError("timestamps must be in one clock domain and ordered")
queue, compute, output, age = (
start - capture,
finish - start,
present - finish,
present - capture,
)
ages.append(age)
print(
f"frame={row['frame']} queue={queue} compute={compute} output={output} age={age} ms"
)
assert ages == [15, 20, 220]
print("constructed case: compute stays 10 ms while final age reaches 220 ms")
在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。
cd 'content/posts/驱动、bootloader、文件系统/嵌入式Linux系统工程/118-案例:网络视频卡顿与帧龄/code' && python3 main.py
官方资料与版本边界
内核、工具和厂商 BSP 的支持范围需分别核对。参考资料可能对应较新版本;不要据此推定旧 BSP 支持所有接口。