Skip to main content

dump_info/
dump_info.rs

1use std::io::Write;
2
3use libav_ng::{
4    avcodec::CodecContext, avformat::FormatContext, avframe::Frame, avpacket::Packet, sws::Sws,
5};
6use libav_sys_ng::{
7    AVMediaType_AVMEDIA_TYPE_AUDIO, AVMediaType_AVMEDIA_TYPE_VIDEO, AVPixelFormat_AV_PIX_FMT_RGB24, SWS_BILINEAR, SwsContext, sws_freeContext, sws_getContext, sws_scale
8};
9
10fn main() {
11    let url = if let Some(url) = std::env::args().skip(1).next() {
12        url
13    } else {
14        eprintln!("No input file!");
15        std::process::exit(1);
16    };
17
18    let mut format_context = FormatContext::open_input(&url).expect("Failed to open file!");
19
20    format_context.find_stream_info();
21
22    for i in format_context.streams() {
23        let index = i.index();
24        let parameters = i.codec_parameters();
25        let name = parameters.codec_name();
26        let duration_ms = (i.duration_sec() * 1000.0) as i64;
27
28        let (hr, min, sec, msec) = {
29            const HOUR: i64 = 3600 * 1000;
30
31            (
32                duration_ms / HOUR,
33                (duration_ms % HOUR) / (60 * 1000),
34                (duration_ms % (60 * 1000)) / 1000,
35                duration_ms % 1000,
36            )
37        };
38
39        let s_type = if parameters.is_audio() {
40            "audio"
41        } else if parameters.is_video() {
42            "video"
43        } else {
44            "other"
45        };
46
47        println!("Stream #{index}: {s_type}, {name}, ({hr:02}:{min:02}:{sec:02}:{msec:03})");
48
49        if parameters.is_video() {
50            let (width, height) = parameters.size();
51            let bps = parameters.bitrate();
52
53            println!("       |- size: {width} x {height}; {bps} bps");
54        } else if parameters.is_audio() {
55            let bps = parameters.bitrate();
56
57            println!("       |- {bps} bps");
58
59        }
60    }
61}