20个稳定版本 (5个主要版本)
6.0.0 | 2024年2月14日 |
---|---|
5.0.5 | 2023年12月5日 |
5.0.4 | 2023年5月8日 |
5.0.3 | 2022年12月2日 |
1.0.1 | 2016年6月3日 |
#23 in 视频
14,418 每月下载量
在 24 个crate中使用了(16个直接使用)
80KB
2K SLoC
m3u8-rs
用于解析m3u8播放列表(HTTP Live Streaming)的Rust库 链接。使用nom
库进行所有解析。
示例
示例可以在examples
文件夹中找到。
lib.rs
:
用于解析m3u8播放列表的库 HTTP Live Streaming。
示例
解析播放列表,并让解析器确定它是媒体播放列表还是主播放列表。
use m3u8_rs::Playlist;
use nom::IResult;
use std::io::Read;
let mut file = std::fs::File::open("playlist.m3u8").unwrap();
let mut bytes: Vec<u8> = Vec::new();
file.read_to_end(&mut bytes).unwrap();
match m3u8_rs::parse_playlist(&bytes) {
Result::Ok((i, Playlist::MasterPlaylist(pl))) => println!("Master playlist:\n{:?}", pl),
Result::Ok((i, Playlist::MediaPlaylist(pl))) => println!("Media playlist:\n{:?}", pl),
Result::Err(e) => panic!("Parsing error: \n{}", e),
}
直接解析主播放列表
use std::io::Read;
use nom::IResult;
let mut file = std::fs::File::open("masterplaylist.m3u8").unwrap();
let mut bytes: Vec<u8> = Vec::new();
file.read_to_end(&mut bytes).unwrap();
if let Result::Ok((_, pl)) = m3u8_rs::parse_master_playlist(&bytes) {
println!("{:?}", pl);
}
创建播放列表并将其写回到vec/file
use m3u8_rs::{MediaPlaylist, MediaPlaylistType, MediaSegment};
let playlist = MediaPlaylist {
version: Some(6),
target_duration: 3,
media_sequence: 338559,
discontinuity_sequence: 1234,
end_list: true,
playlist_type: Some(MediaPlaylistType::Vod),
segments: vec![
MediaSegment {
uri: "20140311T113819-01-338559live.ts".into(),
duration: 2.002,
title: Some("title".into()),
..Default::default()
},
],
..Default::default()
};
//let mut v: Vec<u8> = Vec::new();
//playlist.write_to(&mut v).unwrap();
//let mut file = std::fs::File::open("playlist.m3u8").unwrap();
//playlist.write_to(&mut file).unwrap();
控制浮点数的输出精度,例如#EXTINF(默认为未设置)
use std::sync::atomic::Ordering;
use m3u8_rs::{WRITE_OPT_FLOAT_PRECISION, MediaPlaylist, MediaSegment};
WRITE_OPT_FLOAT_PRECISION.store(5, Ordering::Relaxed);
let playlist = MediaPlaylist {
target_duration: 3,
segments: vec![
MediaSegment {
duration: 2.9,
title: Some("title".into()),
..Default::default()
},
],
..Default::default()
};
let mut v: Vec<u8> = Vec::new();
playlist.write_to(&mut v).unwrap();
let m3u8_str: &str = std::str::from_utf8(&v).unwrap();
assert!(m3u8_str.contains("#EXTINF:2.90000,title"));
依赖项
~1–1.4MB
~22K SLoC