A high-quality AAC audio encoder plugin for DaVinci Resolve Studio on Linux, using the Fraunhofer FDK-AAC library. Thanks to 'toxblh' for the the original concept.
Please don't ask for AAC or other input plugins. BlackMagic have disabled the option of making input plugins for commercial and licensing reasons and I respect their decision to do that. If you are looking for a quick way to import mp4 with AAC I recommend a small script I created which adds a right click in file explorer Nemo which does a quick transcode of the AAC to FLAC and remuxes with the pass-through AVC video, it is the only option at this point. I will put that in another repo.
AAC codec available in audio settings
clang++ or g++ (C++11 support)pkg-configlibfdk-aac-dev (Fraunhofer FDK-AAC library)# 1. Clone the repository
git clone https://github.com/hexitnz/Resolve-Linux-Studio-AAC-FDK-Encoder-plugin.git
cd Resolve-Linux-Studio-AAC-FDK-Encoder-plugin
# 2. Run the automated installer
chmod +x install.sh
./install.sh
The installer will:
Ubuntu/Debian/Linux Mint:
sudo apt update
sudo apt install build-essential pkg-config libfdk-aac-dev clang
Arch Linux:
sudo pacman -S base-devel clang libfdk-aac
Fedora:
sudo dnf install clang make pkgconfig libfdk-aac-devel
cd src
make clean
make
sudo make install
Or manually:
sudo cp -r aac_fdk_plugin.dvcp.bundle /opt/resolve/IOPlugins/
sudo chmod -R 755 /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
Restart DaVinci Resolve completely:
killall resolve
/opt/resolve/bin/resolve
Check installation:
ls -la /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle/Contents/Linux-x86-64/
Verify DaVinci Resolve Studio:
Restart Resolve completely:
killall -9 resolve
/opt/resolve/bin/resolve
Install libfdk-aac:
# Ubuntu/Debian
sudo apt install libfdk-aac-dev
# Arch
sudo pacman -S libfdk-aac
# Fedora (may need RPM Fusion repositories)
sudo dnf install libfdk-aac-devel
Verify installation:
pkg-config --modversion fdk-aac
This usually indicates a mismatch between input format and plugin expectations.
Try these settings in Resolve:
Check logs:
tail -f ~/.local/share/DaVinciResolve/logs/davinci_resolve.log | grep "AAC"
Fix permissions:
sudo chown -R root:root /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
sudo chmod -R 755 /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
Verify the plugin is being used:
# Start Resolve from terminal
/opt/resolve/bin/resolve 2>&1 | grep "AAC Plugin"
You should see messages like:
AAC Encoder :: Constructor
AAC Plugin :: Init - 48000 Hz, 2 ch, 16-bit, 192 kbps
AAC Plugin :: Time base declared as 1/48000 (sample-accurate PTS/Duration)
AAC Plugin :: AudioSpecificConfig forwarded to muxer (2 bytes)
AAC Plugin :: Opened - 192 kbps CBR, 2.0 stereo, frame size: 1024, inputChannels confirmed: 2
If you don't see these messages, the plugin isn't loading.
Exported files play correctly in VLC and via web-based players (e.g. a
Nextcloud share), and report correct stream properties with ffprobe,
but fail to play (often silently, with picture but no audio) in certain
local players -- QuickTime Player on macOS is the most commonly reported
case so far.
This is a known issue and appears to sit outside what the codec plugin can
control. The actual AAC audio data is correct -- ffprobe reads the codec
configuration directly from the bitstream and confirms valid AAC-LC at the
expected sample rate/channels, and VLC plays it back correctly in sync.
The most likely explanation is that Resolve's own internal MP4 muxer
(which assembles the final moov/esds/stsd boxes from what the plugin
provides) writes container metadata that's complete enough for VLC's,
ffprobe's, and most streaming/web players' more lenient parsing, but not
strict enough for some stricter local demuxers (QuickTime's
AVFoundation-based demuxer being the most commonly reported example), which
are historically pickier about MP4 box structure. This is not something the
IPluginCodecRef plugin interface gives this codec direct control over.
If a client or colleague reports a file "won't play" -- but it played fine when you (or they) streamed/previewed it elsewhere (Nextcloud, Google Drive's preview, a browser, VLC) -- the file itself is very likely fine. The difference is almost always which local player/app they used to open the downloaded file, not a problem with the export. Ask what app they used to open it before assuming the export is broken.
Workaround: remux (or remux+re-encode) the exported file with ffmpeg,
which rewrites the container cleanly:
# Re-encode audio and rewrite the container (known to work):
ffmpeg -i "input.mp4" -c:v copy -c:a aac -b:a 320k -movflags +faststart "output.mp4"
# Or, lossless remux only (no audio re-encode, try this first):
ffmpeg -i "input.mp4" -c copy -movflags +faststart "output.mp4"
-movflags +faststart relocates and rewrites the moov atom via ffmpeg's
own muxer, which appears to resolve compatibility with stricter players.
If you can compare mp4box -info (or ffprobe -show_streams -show_format -print_format json) output between a Resolve-exported file and an
ffmpeg-remuxed one and spot the specific field that differs, please open
an issue with the diff -- that would help pin down exactly what Resolve's
muxer is doing differently.
As of v1.1.3, this codec actively rejects MKV exports and won't appear as
a selectable audio codec option when MKV is the chosen container --
Resolve's deliver page will hide/gray it out. If you're on an older
version and exporting to .mkv, upgrade and switch to MP4 or MOV instead.
(Note for anyone tracking versions closely: v1.1.2 first attempted this
by removing mkv from the codec's declared container list at
registration, but that alone didn't actually stop Resolve from allowing
the combination -- it still let the export proceed and produced a broken
file. v1.1.3 added a hard runtime check in the plugin's init step that
reads the actual target container for each export and refuses outright if
it's MKV, which is what's actually effective.)
Root cause (for anyone curious or maintaining a fork): this was
confirmed, not assumed. The plugin sends correct per-frame pIOPropPTS
and pIOPropDuration values with an explicit pIOPropTimeBase of
1/sampleRate -- the exact same logic, byte for byte, that produces
correct timing metadata in MP4/MOV exports. Despite that, files exported
to MKV consistently showed Duration: 00:00:00.000000000 on the audio
track (visible via ffprobe -show_entries stream_tags=DURATION), even
though the audio data itself was valid AAC and the computed/observed
duration (from packet count) was correct. A zero-duration track is
commonly treated as empty/silent by players, explaining the no-audio
symptom. The SDK doesn't expose any separate "total track duration" hint
a codec plugin could supply to correct this -- Resolve's own Matroska
muxer appears to not derive the Duration element correctly from the
per-block timing it's given, in a way its MP4 muxer does correctly from
the equivalent data. This isn't fixable on the encoding side; it would
need a fix in Resolve's MKV muxer itself, so the plugin now blocks the
combination instead.
If you need an MKV deliverable, export to MP4 or MOV from Resolve and
remux losslessly with ffmpeg:
ffmpeg -i "input.mp4" -c copy "output.mkv"
sudo rm -rf /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
Then restart DaVinci Resolve.
The plugin uses:
Resolve (16-bit PCM, stereo)
↓
Plugin (convert to float planar)
↓
Ring Buffer (accumulate 1024 samples)
↓
FDK-AAC (encode to AAC)
↓
MP4 Muxer (write to file)
| Parameter | Values |
|---|---|
| Containers | MP4, MOV (MKV not supported -- see Known Limitations) |
| Sample Rates | 44100 Hz, 48000 Hz |
| Bit Depths | 16-bit PCM |
| Channels | Stereo (2) only |
| Bitrates | 96-320 kbps |
| Profile | AAC-LC (Low Complexity) |
# Build with debug symbols
cd src
make clean
make CXXFLAGS="-std=c++11 -fPIC -g -Wall -I. -Iinclude"
davinci-aac-fdk-plugin/
├── src/
│ ├── aac_encoder.cpp # Main encoder implementation
│ ├── aac_encoder.h # Header file
│ ├── plugin.cpp # Plugin registration
│ ├── plugin.h # Plugin header
│ ├── wrapper/ # SDK wrapper files
│ ├── include/ # SDK include files
│ └── Makefile # Build configuration
├── install.sh # Automated installer
├── README.md # This file
├── LICENSE # GPL v3 license
└── docs/
├── BUILDING.md # Detailed build instructions
├── TROUBLESHOOTING.md # Common issues and solutions
└── images/ # Screenshots
Contributions are welcome! Please:
git checkout -b feature/improvement)git commit -am 'Add new feature')git push origin feature/improvement)Areas for contribution:
Q: Why FDK-AAC instead of FFmpeg's native AAC encoder?
A: FDK-AAC produces significantly higher quality audio, especially at lower bitrates. It's considered one of the best AAC encoders available.
Q: Does this work with DaVinci Resolve Free?
A: No. The free version does not support third-party plugins.
Q: What bitrate should I use?
A: For most purposes:
Q: Can I use this for commercial projects?
A: Yes. The plugin is GPL v3, and FDK-AAC is available for use. Check your local laws regarding AAC patents.
Q: Why is the audio stream showing as "AAC LTP" / "64.0 kHz" (or even the wrong channel count/layout, e.g. "4 channels" / "C L R Cb") in MediaInfo instead of "AAC LC" / "48.0 kHz" / "L R" stereo?
A: This is a known MediaInfo display quirk, not an encoding defect, and it's been confirmed reproducible across multiple machines. The plugin always encodes correct AAC-LC stereo audio at the sample rate you set (44.1/48 kHz) -- MediaInfo's parsing of certain fields in the MP4 container metadata Resolve's muxer writes is unreliable, and it can misreport profile, sample rate, and channel count/layout, sometimes all at once on the same file.
You can confirm the real stream properties independently. Two options, no terminal required if you'd rather not use the command line:
examples/ if you're on Linux Mint/Cinnamon.Or from a terminal:
ffprobe -v error -show_entries stream=codec_name,sample_rate,channels,channel_layout,bit_rate -of default=noprint_wrappers=1 yourfile.mp4
Both read the codec configuration directly from the bitstream rather than relying on MediaInfo's heuristics, and will correctly report the AAC codec, your real sample rate, and stereo channel layout.
If a client reports a file "won't play" but it played fine through a streaming/web preview (Nextcloud, Google Drive, a browser), see the playback troubleshooting entry above -- that's very likely a local-player compatibility issue, not a broken export.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
See CHANGELOG.md for full details.
examples/ffprobe-info.nemo_actioncannot find -lc++) by removing an unnecessary -stdlib=libc++ link flagesds metadata (correct time base + AudioSpecificConfig forwarding)install.sh now builds from src/ instead of an embedded copyMade with ❤️ for the DaVinci Resolve Linux community
17 commits
Hacker News (1)
C++
93.8%
Shell
4.2%
Makefile
1.9%
A high-quality AAC audio encoder plugin for DaVinci Resolve Studio on Linux, using the Fraunhofer FDK-AAC library. Thanks to 'toxblh' for the the original concept.
Please don't ask for AAC or other input plugins. BlackMagic have disabled the option of making input plugins for commercial and licensing reasons and I respect their decision to do that. If you are looking for a quick way to import mp4 with AAC I recommend a small script I created which adds a right click in file explorer Nemo which does a quick transcode of the AAC to FLAC and remuxes with the pass-through AVC video, it is the only option at this point. I will put that in another repo.
AAC codec available in audio settings
clang++ or g++ (C++11 support)pkg-configlibfdk-aac-dev (Fraunhofer FDK-AAC library)# 1. Clone the repository
git clone https://github.com/hexitnz/Resolve-Linux-Studio-AAC-FDK-Encoder-plugin.git
cd Resolve-Linux-Studio-AAC-FDK-Encoder-plugin
# 2. Run the automated installer
chmod +x install.sh
./install.sh
The installer will:
Ubuntu/Debian/Linux Mint:
sudo apt update
sudo apt install build-essential pkg-config libfdk-aac-dev clang
Arch Linux:
sudo pacman -S base-devel clang libfdk-aac
Fedora:
sudo dnf install clang make pkgconfig libfdk-aac-devel
cd src
make clean
make
sudo make install
Or manually:
sudo cp -r aac_fdk_plugin.dvcp.bundle /opt/resolve/IOPlugins/
sudo chmod -R 755 /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
Restart DaVinci Resolve completely:
killall resolve
/opt/resolve/bin/resolve
Check installation:
ls -la /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle/Contents/Linux-x86-64/
Verify DaVinci Resolve Studio:
Restart Resolve completely:
killall -9 resolve
/opt/resolve/bin/resolve
Install libfdk-aac:
# Ubuntu/Debian
sudo apt install libfdk-aac-dev
# Arch
sudo pacman -S libfdk-aac
# Fedora (may need RPM Fusion repositories)
sudo dnf install libfdk-aac-devel
Verify installation:
pkg-config --modversion fdk-aac
This usually indicates a mismatch between input format and plugin expectations.
Try these settings in Resolve:
Check logs:
tail -f ~/.local/share/DaVinciResolve/logs/davinci_resolve.log | grep "AAC"
Fix permissions:
sudo chown -R root:root /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
sudo chmod -R 755 /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
Verify the plugin is being used:
# Start Resolve from terminal
/opt/resolve/bin/resolve 2>&1 | grep "AAC Plugin"
You should see messages like:
AAC Encoder :: Constructor
AAC Plugin :: Init - 48000 Hz, 2 ch, 16-bit, 192 kbps
AAC Plugin :: Time base declared as 1/48000 (sample-accurate PTS/Duration)
AAC Plugin :: AudioSpecificConfig forwarded to muxer (2 bytes)
AAC Plugin :: Opened - 192 kbps CBR, 2.0 stereo, frame size: 1024, inputChannels confirmed: 2
If you don't see these messages, the plugin isn't loading.
Exported files play correctly in VLC and via web-based players (e.g. a
Nextcloud share), and report correct stream properties with ffprobe,
but fail to play (often silently, with picture but no audio) in certain
local players -- QuickTime Player on macOS is the most commonly reported
case so far.
This is a known issue and appears to sit outside what the codec plugin can
control. The actual AAC audio data is correct -- ffprobe reads the codec
configuration directly from the bitstream and confirms valid AAC-LC at the
expected sample rate/channels, and VLC plays it back correctly in sync.
The most likely explanation is that Resolve's own internal MP4 muxer
(which assembles the final moov/esds/stsd boxes from what the plugin
provides) writes container metadata that's complete enough for VLC's,
ffprobe's, and most streaming/web players' more lenient parsing, but not
strict enough for some stricter local demuxers (QuickTime's
AVFoundation-based demuxer being the most commonly reported example), which
are historically pickier about MP4 box structure. This is not something the
IPluginCodecRef plugin interface gives this codec direct control over.
If a client or colleague reports a file "won't play" -- but it played fine when you (or they) streamed/previewed it elsewhere (Nextcloud, Google Drive's preview, a browser, VLC) -- the file itself is very likely fine. The difference is almost always which local player/app they used to open the downloaded file, not a problem with the export. Ask what app they used to open it before assuming the export is broken.
Workaround: remux (or remux+re-encode) the exported file with ffmpeg,
which rewrites the container cleanly:
# Re-encode audio and rewrite the container (known to work):
ffmpeg -i "input.mp4" -c:v copy -c:a aac -b:a 320k -movflags +faststart "output.mp4"
# Or, lossless remux only (no audio re-encode, try this first):
ffmpeg -i "input.mp4" -c copy -movflags +faststart "output.mp4"
-movflags +faststart relocates and rewrites the moov atom via ffmpeg's
own muxer, which appears to resolve compatibility with stricter players.
If you can compare mp4box -info (or ffprobe -show_streams -show_format -print_format json) output between a Resolve-exported file and an
ffmpeg-remuxed one and spot the specific field that differs, please open
an issue with the diff -- that would help pin down exactly what Resolve's
muxer is doing differently.
As of v1.1.3, this codec actively rejects MKV exports and won't appear as
a selectable audio codec option when MKV is the chosen container --
Resolve's deliver page will hide/gray it out. If you're on an older
version and exporting to .mkv, upgrade and switch to MP4 or MOV instead.
(Note for anyone tracking versions closely: v1.1.2 first attempted this
by removing mkv from the codec's declared container list at
registration, but that alone didn't actually stop Resolve from allowing
the combination -- it still let the export proceed and produced a broken
file. v1.1.3 added a hard runtime check in the plugin's init step that
reads the actual target container for each export and refuses outright if
it's MKV, which is what's actually effective.)
Root cause (for anyone curious or maintaining a fork): this was
confirmed, not assumed. The plugin sends correct per-frame pIOPropPTS
and pIOPropDuration values with an explicit pIOPropTimeBase of
1/sampleRate -- the exact same logic, byte for byte, that produces
correct timing metadata in MP4/MOV exports. Despite that, files exported
to MKV consistently showed Duration: 00:00:00.000000000 on the audio
track (visible via ffprobe -show_entries stream_tags=DURATION), even
though the audio data itself was valid AAC and the computed/observed
duration (from packet count) was correct. A zero-duration track is
commonly treated as empty/silent by players, explaining the no-audio
symptom. The SDK doesn't expose any separate "total track duration" hint
a codec plugin could supply to correct this -- Resolve's own Matroska
muxer appears to not derive the Duration element correctly from the
per-block timing it's given, in a way its MP4 muxer does correctly from
the equivalent data. This isn't fixable on the encoding side; it would
need a fix in Resolve's MKV muxer itself, so the plugin now blocks the
combination instead.
If you need an MKV deliverable, export to MP4 or MOV from Resolve and
remux losslessly with ffmpeg:
ffmpeg -i "input.mp4" -c copy "output.mkv"
sudo rm -rf /opt/resolve/IOPlugins/aac_fdk_plugin.dvcp.bundle
Then restart DaVinci Resolve.
The plugin uses:
Resolve (16-bit PCM, stereo)
↓
Plugin (convert to float planar)
↓
Ring Buffer (accumulate 1024 samples)
↓
FDK-AAC (encode to AAC)
↓
MP4 Muxer (write to file)
| Parameter | Values |
|---|---|
| Containers | MP4, MOV (MKV not supported -- see Known Limitations) |
| Sample Rates | 44100 Hz, 48000 Hz |
| Bit Depths | 16-bit PCM |
| Channels | Stereo (2) only |
| Bitrates | 96-320 kbps |
| Profile | AAC-LC (Low Complexity) |
# Build with debug symbols
cd src
make clean
make CXXFLAGS="-std=c++11 -fPIC -g -Wall -I. -Iinclude"
davinci-aac-fdk-plugin/
├── src/
│ ├── aac_encoder.cpp # Main encoder implementation
│ ├── aac_encoder.h # Header file
│ ├── plugin.cpp # Plugin registration
│ ├── plugin.h # Plugin header
│ ├── wrapper/ # SDK wrapper files
│ ├── include/ # SDK include files
│ └── Makefile # Build configuration
├── install.sh # Automated installer
├── README.md # This file
├── LICENSE # GPL v3 license
└── docs/
├── BUILDING.md # Detailed build instructions
├── TROUBLESHOOTING.md # Common issues and solutions
└── images/ # Screenshots
Contributions are welcome! Please:
git checkout -b feature/improvement)git commit -am 'Add new feature')git push origin feature/improvement)Areas for contribution:
Q: Why FDK-AAC instead of FFmpeg's native AAC encoder?
A: FDK-AAC produces significantly higher quality audio, especially at lower bitrates. It's considered one of the best AAC encoders available.
Q: Does this work with DaVinci Resolve Free?
A: No. The free version does not support third-party plugins.
Q: What bitrate should I use?
A: For most purposes:
Q: Can I use this for commercial projects?
A: Yes. The plugin is GPL v3, and FDK-AAC is available for use. Check your local laws regarding AAC patents.
Q: Why is the audio stream showing as "AAC LTP" / "64.0 kHz" (or even the wrong channel count/layout, e.g. "4 channels" / "C L R Cb") in MediaInfo instead of "AAC LC" / "48.0 kHz" / "L R" stereo?
A: This is a known MediaInfo display quirk, not an encoding defect, and it's been confirmed reproducible across multiple machines. The plugin always encodes correct AAC-LC stereo audio at the sample rate you set (44.1/48 kHz) -- MediaInfo's parsing of certain fields in the MP4 container metadata Resolve's muxer writes is unreliable, and it can misreport profile, sample rate, and channel count/layout, sometimes all at once on the same file.
You can confirm the real stream properties independently. Two options, no terminal required if you'd rather not use the command line:
examples/ if you're on Linux Mint/Cinnamon.Or from a terminal:
ffprobe -v error -show_entries stream=codec_name,sample_rate,channels,channel_layout,bit_rate -of default=noprint_wrappers=1 yourfile.mp4
Both read the codec configuration directly from the bitstream rather than relying on MediaInfo's heuristics, and will correctly report the AAC codec, your real sample rate, and stereo channel layout.
If a client reports a file "won't play" but it played fine through a streaming/web preview (Nextcloud, Google Drive, a browser), see the playback troubleshooting entry above -- that's very likely a local-player compatibility issue, not a broken export.
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
See CHANGELOG.md for full details.
examples/ffprobe-info.nemo_actioncannot find -lc++) by removing an unnecessary -stdlib=libc++ link flagesds metadata (correct time base + AudioSpecificConfig forwarding)install.sh now builds from src/ instead of an embedded copyMade with ❤️ for the DaVinci Resolve Linux community
Hacker News (1)
17 commits
C++
93.8%
Shell
4.2%
Makefile
1.9%