1个不稳定版本
0.1.0 | 2021年9月28日 |
---|
#206 在 视频
41KB
996 行
syeve – 简单高效的视频编码
这是一个无损视频编解码器,旨在屏幕捕获以及您想要以PNG格式而不是JPEG格式格式化的任何其他内容。它是视频的PNG。
与PNG一样,有两步:过滤和压缩。
过滤器将像素转换为相邻像素之间的差异。这样,具有相同颜色的相邻像素的值为0,线性渐变成为常数序列。过滤后的图像现在更容易用传统算法压缩。
与PNG的不同之处在于,过滤器还考虑了时间上的差异,因此如果帧几乎相同,它们将充满零。
示例
运行一个P2P视频会议示例
# Run these commands in two different terminals or machines
cargo run --release -p conference -- server 0.0.0.0:8080
cargo run --release -p conference -- client 127.0.0.1:8080
(将 127.0.0.1
更改为服务器地址)
// Let `input_raw_frame: Vec<u8>` be an RGB24 bitmap of size 1920*1080
let mut buf = Vec::new();
let mut encoder = syeve::Encoder::new((1920, 1080), 3, syeve::Compression::Brotli(4), 30);
encoder.encode(&mut input_raw_frame, &mut buf).unwrap();
let mut decoder = syeve::Decoder::new();
let output_raw_frame = decoder.decode(&buf).unwrap().pixels;
动机
有损视频格式非常高效,但
- 它们非常复杂,涉及大量数学概念,除非它是您的研究领域,否则您无法理解;
- 因此,它们的实现很少;
- 这些实现中没有一个是程序员容易使用的;
- 它们在屏幕捕获方面的性能不佳,无论是在带宽还是可读性方面;
- 视频处理很有趣。
状态
⚠ 不稳定,未进行基准测试,未进行模糊测试... 但有希望 😎
- 将图像划分为单独的块
- 删除不安全代码
- 可选的有损优化?(海报化)
- 基准测试
- 更多测试(帧丢失)
- 解码时避免分配
单帧编码比使用 image-rs/image-png
更快(多亏了SIMD优化)。
任何关于优化(可能是有损的)、基准测试或其他方面的帮助都将受到高度重视。 (PR/问题/电子邮件欢迎)
协议
协议非常简单:类似于PNG,但每个帧都依赖于前一帧。
- 序列号(u32 BE)
- 帧号(u32 BE)
- 宽度(u32 BE)
- 高度(u32 BE)
- 像素大小(u8)
- 压缩算法(u8)
- 数据
"data"是经过过滤的位图图像,使用指定的算法进行压缩。其长度为width*height*pixel_size
。(pixel_size
是每像素的字节数,通常RGB为3,RGBA为4)
压缩算法
- brotli
- deflate
第一帧应将帧号设为零。帧号必须在每帧之间递增一。因为每帧都依赖于前帧,帧丢失可能会导致解码器损坏帧。通过定期发送一个完全自描述的帧来减少这个问题。这个帧应将帧号设为零,并且序列号与前帧不同(通常递增一)。第一帧的序列号可以是随机的。
来源
许可
版权所有 2021 Pascal Engélibert
本程序是自由软件:您可以按照自由软件基金会发布的GNU Affero通用公共许可证的条款重新分发和/或修改它,许可证版本为3。
本程序的分发是希望它将是有用的,但没有任何保证;甚至没有对适销性或特定用途适用性的暗示保证。有关详细信息,请参阅GNU Affero通用公共许可证。
您应该已收到本程序的GNU Affero通用公共许可证副本。如果没有,请参阅https://www.gnu.org/licenses/。
依赖关系
~1–1.5MB
~28K SLoC