- C# 100%
| AudioBookJoiner.Wpf | ||
| .editorconfig | ||
| .gitignore | ||
| AudioBookJoiner.Wpf.sln | ||
| LICENSE | ||
| README.md | ||
AudioBookJoiner
Runtime dependency: FFmpeg
AudioBookJoiner calls ffmpeg and ffprobe for metadata, cover extraction, duration probing, and file joining.
The project references the NuGet package FFMpegInstaller.Windows.x64. During restore/build, NuGet downloads the Windows x64 FFmpeg runtime and copies it into the build output under a relative folder:
bin\<Configuration>\net8.0-windows\ffmpeg\bin\ffmpeg.exe
bin\<Configuration>\net8.0-windows\ffmpeg\bin\ffprobe.exe
The app looks for ffmpeg.exe and ffprobe.exe in this order:
- The directory set in
AUDIOBOOKJOIN_FFMPEG_DIR. - Next to
AudioBookJoiner.Wpf.exe. ffmpeg\binnext toAudioBookJoiner.Wpf.exe— the NuGet-provided relative runtime path.tools\ffmpeg\binunder the app/project directory for manual app-local overrides.- Any directory on
PATH.
After pulling the repo, rebuild or run:
dotnet restore .\AudioBookJoiner.Wpf.sln
dotnet build .\AudioBookJoiner.Wpf.sln -c Debug
Verify the relative runtime files:
Test-Path .\AudioBookJoiner.Wpf\bin\Debug\net8.0-windows\ffmpeg\bin\ffmpeg.exe
Test-Path .\AudioBookJoiner.Wpf\bin\Debug\net8.0-windows\ffmpeg\bin\ffprobe.exe
Expected:
True
True
Manual/global FFmpeg installs are still supported, but they are no longer required for normal Visual Studio debug builds.
Embedded/internal chapter import
AudioBookJoiner can inspect a selected single audiobook file for embedded chapters before export.
Use:
- Add one
.mp3,.m4a, or.m4bfile. - Select it in the file list.
- Click Read Internal Chapters.
- Review the imported chapter table and log diagnostics.
- Click Start to export using those imported chapter markers.
Chapter detection tries:
ffprobe -show_chaptersfor MP3/M4A/M4B containers.- A raw MP3 ID3v2
CHAP/CTOCframe scan when ffprobe does not expose usable MP3 chapters.
If no usable embedded chapters are found, the app keeps the original behavior: each input file becomes one output chapter.