43 lines
1.1 KiB
Markdown
43 lines
1.1 KiB
Markdown
|
# ffmpeg-rs-raw
|
||
|
|
||
|
**UNSAFE** ffmpeg lib
|
||
|
|
||
|
Providing common utility classes in an unsafe manner.
|
||
|
|
||
|
## Example
|
||
|
Decoding a video file:
|
||
|
```rust
|
||
|
// Demuxer extracts the streams (audio/video)
|
||
|
// from the container (mp4/mov/avi/mkv etc.)
|
||
|
let mut demuxer = Demuxer::new("./example.mp4");
|
||
|
|
||
|
// Start by "probing" the file to determine stream info etc
|
||
|
let media_info = demuxer.probe_input()?;
|
||
|
println!("{}", media_info);
|
||
|
|
||
|
// Once probing is done, setup the decoder
|
||
|
let mut decoder = Decoder::new();
|
||
|
// enable hardware decoding
|
||
|
decoder.enable_hw_decoder_any();
|
||
|
|
||
|
// Setup decoders for all streams
|
||
|
for ref stream in media_info.channels {
|
||
|
decoder.setup_decoder(stream, None)?;
|
||
|
}
|
||
|
|
||
|
loop {
|
||
|
let (mut pkt, stream) = demuxer.get_packet()?;
|
||
|
let frames = decoder.decode_pkt(pkt, stream)?;
|
||
|
for (mut frame, _stream) in frames {
|
||
|
// do something with the frame
|
||
|
av_frame_free(&mut frame);
|
||
|
}
|
||
|
// EOF, its important to do this AFTER [decoder.decode_pkt]
|
||
|
// the NULL pkt is a flush pkt and will get the last frames from the
|
||
|
// decoder (if any)
|
||
|
if pkt.is_null() {
|
||
|
break;
|
||
|
}
|
||
|
av_packet_free(&mut pkt);
|
||
|
}
|
||
|
```
|