11个版本
0.1.10 | 2023年5月19日 |
---|---|
0.1.9 | 2023年5月19日 |
#87 在 视频
用于 pgv-cli
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