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}