#直播流 #播放列表 #解析器 #m3u8 #http #apple #hls

m3u8-rs

用于解析m3u8文件(苹果的HTTP Live Streaming(HLS)协议)的库

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 视频

Download history 3154/week @ 2024-04-08 3795/week @ 2024-04-15 4111/week @ 2024-04-22 3877/week @ 2024-04-29 3133/week @ 2024-05-06 3619/week @ 2024-05-13 4033/week @ 2024-05-20 4137/week @ 2024-05-27 4098/week @ 2024-06-03 3383/week @ 2024-06-10 3854/week @ 2024-06-17 3148/week @ 2024-06-24 3397/week @ 2024-07-01 3730/week @ 2024-07-08 3542/week @ 2024-07-15 3517/week @ 2024-07-22

14,418 每月下载量
24 个crate中使用了(16个直接使用)

MIT 协议

80KB
2K SLoC

m3u8-rs

crates.io API

用于解析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