366 words
2 minutes
Rust_ver_FFmpeg_001

Rust version of FFmpeg#

  • Yes. If you’re designing a Rust version of FFmpeg, I would organize codecs by codec/format family, rather than putting everything into one large codec.rs.

  • A structure like this works well:

src/
└── codec/
    ├── mod.rs
    │
    ├── audio/
    │   ├── mod.rs
    │   ├── pcm.rs
    │   ├── aac.rs
    │   ├── mp3.rs
    │   ├── opus.rs
    │   ├── vorbis.rs
    │   ├── flac.rs
    │   └── ac3.rs
    │
    └── video/
        ├── mod.rs
        ├── h264.rs
        ├── h265.rs
        ├── vp8.rs
        ├── vp9.rs
        ├── av1.rs
        └── mpeg2.rs

Common codecs to implement#

Audio#

Rust fileCodecType
pcm.rsPCMUncompressed audio
aac.rsAACLossy audio
mp3.rsMP3Lossy audio
opus.rsOpusLossy audio
vorbis.rsVorbisLossy audio
flac.rsFLACLossless audio
ac3.rsAC-3 / Dolby DigitalLossy audio
eac3.rsE-AC-3Lossy audio
alac.rsALACLossless audio

Video#

Rust fileCodecType
h264.rsH.264 / AVCLossy video
h265.rsH.265 / HEVCLossy video
mpeg1.rsMPEG-1 VideoLossy video
mpeg2.rsMPEG-2 VideoLossy video
mpeg4.rsMPEG-4 Part 2Lossy video
vp8.rsVP8Lossy video
vp9.rsVP9Lossy video
av1.rsAV1Lossy video
theora.rsTheoraLossy video

If you’re trying to reproduce FFmpeg’s architecture#

I’d actually go one step further:

src/
├── codec/
│   ├── mod.rs
│   │
│   ├── audio/
│   │   ├── mod.rs
│   │   ├── pcm.rs
│   │   ├── aac.rs
│   │   ├── mp3.rs
│   │   └── opus.rs
│   │
│   └── video/
│       ├── mod.rs
│       ├── h264.rs
│       ├── h265.rs
│       └── av1.rs
│
├── format/
│   ├── mod.rs
│   ├── mp4.rs
│   ├── mkv.rs
│   ├── avi.rs
│   ├── mov.rs
│   ├── flv.rs
│   └── wav.rs
│
├── bitstream/
│   ├── mod.rs
│   ├── reader.rs
│   └── writer.rs
│
├── frame/
│   ├── mod.rs
│   ├── audio.rs
│   └── video.rs
│
├── packet.rs
├── decoder.rs
└── encoder.rs
  • The important distinction is:
                  FFmpeg-like library
                         │
          ┌──────────────┴──────────────┐
          │                             │
       CODECS                         FORMATS
          │                             │
    ┌─────┴─────┐                 ┌─────┴─────┐
    │           │                 │           │
  Audio       Video              MP4        MKV
    │           │
  AAC         H.264
  MP3         H.265
  Opus        AV1
  FLAC        VP9

So:

src/codec/aac.rs
  • means AAC codec implementation.
src/codec/h264.rs
  • means H.264 codec implementation.

  • But:

src/format/mp4.rs
  • means MP4 container/muxer/demuxer, which is different from H.264.
    • For example, an MP4 file might contain:
movie.mp4
│
├── Container: MP4
│
├── Video stream
│   └── Codec: H.264
│
└── Audio stream
    └── Codec: AAC
  • So if you’re building this from scratch, I’d recommend implementing them in roughly this order:
1. PCM
2. WAV container
3. MP3
4. AAC
5. H.264
6. MP4
7. H.265
8. VP9
9. AV1
10. MKV
  • PCM → AAC/MP3 → H.264 → MP4 is a particularly good progression because it takes you from a very simple codec to a sophisticated video codec and then to a container combining audio + video.
Rust_ver_FFmpeg_001
https://younghakim7.github.io/blog/posts/rust_ver_ffmpeg_001/
Author
YoungHa
Published at
2026-09-12