2个版本
0.1.1 | 2024年7月29日 |
---|---|
0.1.0 | 2024年7月29日 |
75 在 视频
每月283次下载
40KB
533 行
klv-uas
一个用于从传输流数据包有效载荷中提取KLV数据的库。此库不旨在用于将KLV数据注入视频流。
警告
当前,您必须启用功能 ignore_incomplete
。我希望用户了解,一些数据类型还无法正确解析,因此他们必须手动允许此操作。
示例
extern crate klv_uas;
use std::env;
use klv_uas::tag::Tag;
use ts_analyzer::reader::TSReader;
use std::fs::File;
use std::io::BufReader;
use klv_uas::klv_packet::KlvPacket;
fn main() {
env_logger::init();
let filename = env::var("TEST_FILE").expect("Environment variable not set");
let f = File::open(filename.clone()).expect("Couldn't open file");
let buf_reader = BufReader::new(f);
let mut reader = TSReader::new(&*filename, buf_reader).expect("Transport Stream file contains no SYNC bytes.");
reader.add_tracked_pid(258);
let klv;
loop {
// Get a payload from the reader. The `unchecked` in the method name means that if an error
// is hit then `Some(payload)` is returned rather than `Ok(Some(payload))` in order to reduce
// `.unwrap()` (or other) calls.
let payload = match reader.next_payload() {
Ok(payload) => payload.expect("Payload is None"),
Err(e) => panic!("Could not get payload due to error: {}", e),
};
// Try to parse a UAS LS KLV packet from the payload that was found. This will likely only
// work if you have the `search` feature enabled as the UAS LS KLV record does not start at
// the first byte of the payload.
klv = match KlvPacket::from_bytes(payload) {
Ok(klv) => klv,
Err(e) => {
continue
},
};
break
}
println!("Timestamp of KLV packet: {:?}", klv.get(Tag::PrecisionTimeStamp).unwrap());
}
目标
- 支持解析KLV字段的所有值类型。
- int
- int8
- int16
- int32
- uint
- uint8
- uint16
- uint32
- uint64
- IMAPB
- Byte
- DLP
- VLP
- FLP
- Set
- UTF8
- 支持将所有类型的KLV值转换为实际值。
- 例如,将KLV标签5(平台航向角)转换为由KLV值中存储的整数值表示的实际浮点角度。
测试
TEST_FILE="$HOME/Truck.ts"cargo run--特性搜索--示例 klv_timestamp
参考资料
依赖关系
~1.2–1.7MB
~41K SLoC