#codec #av #encoding #game

pgv_rs

用于处理PGV(一种类似MPEG的视频编解码器)的库

11个版本

0.1.10 2023年5月19日
0.1.9 2023年5月19日

#87视频


用于 pgv-cli

MIT 许可证

120KB
2.5K SLoC

漂亮的视频

一种主要设计用于游戏和其他应用程序中的离线视频播放的类似MPEG的视频编解码器

编码视频

创建pgv_rs::enc::Encoder,输入帧和音频,然后写入文件

use pgv_rs::enc::Encoder;

let mut enc = Encoder::new(width, height, framerate, 0, samplerate, audio_channels);

// feed in frames as VideoFrames (1 keyframe every 15 frames)
for (idx, frame) in &my_frames.iter().enumerate() {
  if idx % 15 == 0 {
    enc.encode_iframe(frame);
  } else {
    enc.encode_pframe(frame);
  }
}

// encode audio (one Vec<i16> audio buffer per channel)
enc.encode_audio(my_audio);

// write file to disk
let mut out_video = File::create("my_video.pgv").unwrap();
enc.write(&mut out_video).unwrap();

解码视频

创建pgv_rs::dec::Decoder,调用decode_frame获取下一个视频帧,并调用decode_audio获取下一个音频块

use pgv_rs::dec::Decoder;

let mut dec = Decoder::new(my_file).unwrap();

for _ in 0..dec.num_frames {
  // returns Option<VideoFrame>. Note that returned U and V planes will be half the size of the Y plane in both dimensions!
  dec.decode_frame().unwrap();
}

// outputs audio into vector of Vec<i16> audio buffers (one buffer per channel). All buffers must have same length.
dec.decode_audio(my_output_buffers).unwrap();

编解码器比较

虽然主要是一个玩具编解码器,但我还是做了一些其他编解码器的基准测试和比较,主要是与libtheora进行比较。

对于一段特定的1280x720 30FPS视频(由于版权问题,我无法包含在内),我比较了视觉质量、文件大小和解码整个序列(共3774帧)的速度。

执行这些测试的CPU是一款2400 MHz的i5-9300H。这两个测试都是使用-Skylake架构的-O3编译的。

PGV在qscale=0时的视觉效果略逊于设置为5 mbits/sec的Theora,文件大小也略大。然而,视频解码要快一些,并且由于使用了基于QOA的方案,音频解码非常轻量级(尽管在这里没有测量音频性能 - 您可以阅读QOA作者的自己的基准测试

编解码器 文件大小 解码时间
Theora libtheora(通过TheoraPlay) 53.4 MB 6700 ms
PGV pgv_rs 60 MB 5400 ms

依赖项

~1.5MB
~27K SLoC