#frame #codec #lossless #compression #image-compression #pixel

syeve

简单高效的视频编码(无损流编码器)

1个不稳定版本

0.1.0 2021年9月28日

#206视频

AGPL-3.0-only

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)

压缩算法

  1. brotli
  2. deflate

第一帧应将帧号设为零。帧号必须在每帧之间递增一。因为每帧都依赖于前帧,帧丢失可能会导致解码器损坏帧。通过定期发送一个完全自描述的帧来减少这个问题。这个帧应将帧号设为零,并且序列号与前帧不同(通常递增一)。第一帧的序列号可以是随机的。

来源

在LiberaPay上捐赠

许可

版权所有 2021 Pascal Engélibert

本程序是自由软件:您可以按照自由软件基金会发布的GNU Affero通用公共许可证的条款重新分发和/或修改它,许可证版本为3。

本程序的分发是希望它将是有用的,但没有任何保证;甚至没有对适销性或特定用途适用性的暗示保证。有关详细信息,请参阅GNU Affero通用公共许可证。

您应该已收到本程序的GNU Affero通用公共许可证副本。如果没有,请参阅https://www.gnu.org/licenses/

依赖关系

~1–1.5MB
~28K SLoC