1. 概要
高音質なAACエンコーダー libfdk-aac ( Fraunhofer FDK AAC ) を RHEL 10.0 上で ソースコード から ビルド した際の手順を紹介します。
クリーンインストール環境でのビルドであるため、ビルドに必要だった追加パッケージについても明示しています。
本記事の手順によりビルドした libfdk-aac.so
は ffmpeg などをビルドする際にリンク可能です。
libfdk-aac をリンクして ffmpeg をビルドする手順や、ビルド後の ffmpeg を使用した libfdk-aac による AAC へのエンコード手順は下記の続編で紹介しています。
2. libfdk-aac ( Fraunhofer FDK AAC ) とは?
ffmpeg 内蔵の AACエンコーダーよりも 高音質だと言われている AACエンコーダー(コーデック)だそうです。
ライセンス上の理由で ffmpeg には同梱されていないため、ソースコードからビルドする必要があります。
3. 環境
WSL2 環境にクリーンインストールした RHEL10.0 です。
ビルドに必要だった追加パッケージは、エラーが出る都度、後述します。
[loft@studio ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux release 10.0 (Coughlan)
[loft@studio ~]$ uname -a
Linux studio 6.6.87.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Thu Jun 5 18:30:46 UTC 2025 x86_64 GNU/Linux
[loft@studio ~]$
WSL2 や RHEL on WSL2 の インストール手順は下記でご紹介しています。
WSL2 や Linux(RHEL) に慣れている方であれば30分かからないと思います。
4. ソースコードの入手
git clone
します。
[loft@studio ~]$ pwd
/home/loft
[loft@studio ~]$ sudo dnf install git # gitがない場合
[loft@studio ~]$ git clone https://github.com/mstorsjo/fdk-aac.git
[loft@studio ~]$
5. バージョンの選定
バージョン一覧(タグ)を確認します。
本記事執筆時点で最新バージョンの v2.0.3
を採用しました。
[loft@studio fdk-aac]$ git tag
v0.1.0
v0.1.1
v0.1.2
v0.1.3
v0.1.4
v0.1.5
v0.1.6
v2.0.0
v2.0.1
v2.0.2
v2.0.3
[loft@studio fdk-aac]$ git checkout v2.0.3
[loft@studio fdk-aac]$
6. ビルド方法の確認
このリポジトリにはREADME.md
がないです。珍しいです。
How to compile this project? という Issue が立てられています。
CMakeLists.txt
のコメントなどが参考になります。下記は抜粋。
cat CMakeLists.txt
( 抜粋 )
# # CMake project for fdk-aac
#
# ## Basic usage
#
# 1. Download and install CMake >= 3.10 (CMake >= 3.15 is recommended)
# 2. Clone fdk-aac repository
# 3. In fdk-aac directory create and go to `build` subdirectory:
#
# mkdir build
# cd build
#
# 4. Run cmake to configure project with desired build type (Release|Debug):
#
# cmake .. -DCMAKE_BUILD_TYPE=Release
#
# Note CMake configuration without CMAKE_BUILD_TYPE option will not set build
# type to some default and it is most likely is not what you want.
#
# If you want to build static (default is shared library), add BUILD_SHARED_LIBS=OFF option:
#
# # cmake .. -DBUILD_SHARED_LIBS=OFF
#
# You can combine options as well:
#
# cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
#
# 5. Run cmake to build project:
#
# cmake --build . -c Release
7. ビルド手順
基本的に、前述の CMakeLists.txt
に記載されている手順通りに進めていきます。
build
ディレクトリを作成。
[loft@studio ~]$ cd fdk-aac/
[loft@studio fdk-aac]$ mkdir build
[loft@studio fdk-aac]$ cd build
[loft@studio build]$
7.1. ビルド設定
build
ディレクトリで実行します。
[loft@studio build]$ cmake .. -DCMAKE_BUILD_TYPE=Release
-bash: cmake: command not found
[loft@studio build]$
cmake
が無い場合、インストールして継続します。
[loft@studio build]$ sudo dnf install cmake
[loft@studio build]$ cmake .. -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is unknown
-- The CXX compiler identification is unknown
CMake Error at CMakeLists.txt:46 (project):
No CMAKE_C_COMPILER could be found.
Tell CMake where to find the compiler by setting either the environment
variable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path to
the compiler, or to the compiler name if it is in the PATH.
CMake Error at CMakeLists.txt:46 (project):
No CMAKE_CXX_COMPILER could be found.
Tell CMake where to find the compiler by setting either the environment
variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
to the compiler, or to the compiler name if it is in the PATH.
-- Configuring incomplete, errors occurred!
[loft@studio build]$
コンパイラが無い場合、Development Tools
群をインストールして継続します。
[loft@studio build]$ sudo dnf group install "Development Tools"
[loft@studio build]$ cmake .. -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is GNU 14.2.1
-- The CXX compiler identification is GNU 14.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for sin
-- Looking for sin - not found
-- Looking for sin in m
-- Looking for sin in m - found
-- Configuring done (3.8s)
-- Generating done (0.7s)
-- Build files have been written to: /home/loft/fdk-aac/build
[loft@studio build]$ ls -Fla
total 232
drwxrwxrwx 1 loft loft 4096 Sep 15 06:52 ./
drwxrwxrwx 1 loft loft 4096 Sep 15 06:52 ../
-rwxrwxrwx 1 loft loft 20190 Sep 15 06:52 CMakeCache.txt*
drwxrwxrwx 1 loft loft 4096 Sep 15 06:52 CMakeFiles/
-rwxrwxrwx 1 loft loft 5846 Sep 15 06:52 cmake_install.cmake*
-rwxrwxrwx 1 loft loft 3507 Sep 15 06:52 CPackConfig.cmake*
-rwxrwxrwx 1 loft loft 3950 Sep 15 06:52 CPackSourceConfig.cmake*
-rwxrwxrwx 1 loft loft 975 Sep 15 06:52 fdk-aac-config.cmake*
-rwxrwxrwx 1 loft loft 3675 Sep 15 06:52 fdk-aac-config-version.cmake*
-rwxrwxrwx 1 loft loft 254 Sep 15 06:52 fdk-aac.pc*
-rwxrwxrwx 1 loft loft 191402 Sep 15 06:52 Makefile*
[loft@studio build]$
7.2. ビルド
CMakeLists.txt
に記載されている手順通りに cmake --build . -c Release
を実行すると、オプションが無いと言われました。
[loft@studio build]$ cmake --build . -c Release
Unknown argument -c
Usage: cmake --build <dir> [options] [-- [native-options]]
cmake --build --preset <preset> [options] [-- [native-options]]
Options:
<dir> = Project binary directory to be built.
--preset <preset>, --preset=<preset>
= Specify a build preset.
--list-presets[=<type>]
= List available build presets.
--parallel [<jobs>], -j [<jobs>]
= Build in parallel using the given number of jobs.
If <jobs> is omitted the native build tool's
default number is used.
The CMAKE_BUILD_PARALLEL_LEVEL environment variable
specifies a default parallel level when this option
is not given.
-t <tgt>..., --target <tgt>...
= Build <tgt> instead of default targets.
--config <cfg> = For multi-configuration tools, choose <cfg>.
--clean-first = Build target 'clean' first, then build.
(To clean only, use --target 'clean'.)
--resolve-package-references={on|only|off}
= Restore/resolve package references during build.
-v, --verbose = Enable verbose output - if supported - including
the build commands to be executed.
-- = Pass remaining options to the native tool.
上記の通り、CMakeLists.txt
に記載されたコマンドに指定されている -c
というオプションは(今は?)存在しないようですね。
おそらく Debug や Release などのビルドタイプを指定したい意図であるとは推察されます。
usage 内には -c
ではないが --config
オプションは存在しており、世の中には --config Release
を付ける例は散見されます。
なお、前段の手順で CMAKE_BUILD_TYPE=Release
も付与しているので、ここで明示することは不要な環境もあるかもしれません。
下記は パラレル(並列)ビルドのために --parallel
オプションにプロセッサ数( 今回の場合は16
)を付与しています。
time
は時間計測用です。(何度も計測したわけではないですが) ビルド時間は 30秒程度でした。
環境が Linux(RHEL) であるということも鑑みて、オプションの過不足の確認や改善を検討する余地がありそうです。
[loft@studio build]$ nproc
16
[loft@studio build]$ time cmake --build . --config Release --parallel $(nproc)
[ 0%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/FDK_delay.cpp.o
[ 1%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdec_hcr.cpp.o
[ 1%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aac_ram.cpp.o
[ 2%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aac_rom.cpp.o
[ 2%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdec_drc.cpp.o
[ 3%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdec_hcr_bit.cpp.o
[ 4%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdec_hcrs.cpp.o
[ 5%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdec_tns.cpp.o
[ 5%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdec_pns.cpp.o
[ 5%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdecoder.cpp.o
[ 6%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aacdecoder_lib.cpp.o
[ 6%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/channel.cpp.o
[ 7%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/block.cpp.o
[ 8%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/ldfiltbank.cpp.o
[ 9%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/channelinfo.cpp.o
[ 9%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/conceal.cpp.o
[ 9%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/pulsedata.cpp.o
[ 10%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/rvlc.cpp.o
[ 11%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/rvlcbit.cpp.o
[ 11%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/rvlcconceal.cpp.o
[ 12%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/stereo.cpp.o
[ 12%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/usacdec_ace_d4t64.cpp.o
[ 13%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/usacdec_ace_ltp.cpp.o
[ 14%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/usacdec_acelp.cpp.o
[ 14%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/usacdec_fac.cpp.o
[ 15%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/usacdec_lpc.cpp.o
[ 15%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/usacdec_lpd.cpp.o
[ 16%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/usacdec_rom.cpp.o
[ 16%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/aacEnc_ram.cpp.o
[ 17%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/aacEnc_rom.cpp.o
[ 18%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/aacenc.cpp.o
[ 18%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/aacenc_lib.cpp.o
[ 19%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/aacenc_pns.cpp.o
[ 19%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/aacenc_tns.cpp.o
[ 20%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/adj_thr.cpp.o
[ 21%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/band_nrg.cpp.o
[ 21%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/bandwidth.cpp.o
[ 22%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/bit_cnt.cpp.o
[ 22%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/bitenc.cpp.o
[ 23%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/block_switch.cpp.o
[ 23%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/channel_map.cpp.o
[ 24%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/chaosmeasure.cpp.o
[ 25%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/dyn_bits.cpp.o
[ 25%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/grp_data.cpp.o
[ 26%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/intensity.cpp.o
[ 26%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/line_pe.cpp.o
[ 27%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/metadata_compressor.cpp.o
[ 28%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/metadata_main.cpp.o
[ 28%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/mps_main.cpp.o
[ 29%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/ms_stereo.cpp.o
[ 30%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/pnsparam.cpp.o
[ 30%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/noisedet.cpp.o
[ 30%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/pre_echo_control.cpp.o
[ 31%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/psy_configuration.cpp.o
[ 32%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/psy_main.cpp.o
[ 32%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/qc_main.cpp.o
[ 33%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/quantize.cpp.o
[ 33%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/sf_estim.cpp.o
[ 34%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/spreading.cpp.o
[ 35%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/tonality.cpp.o
[ 35%] Building CXX object CMakeFiles/fdk-aac.dir/libAACenc/src/transform.cpp.o
[ 36%] Building CXX object CMakeFiles/fdk-aac.dir/libArithCoding/src/ac_arith_coder.cpp.o
[ 36%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/FDK_drcDecLib.cpp.o
[ 37%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcDec_gainDecoder.cpp.o
[ 38%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcDec_reader.cpp.o
[ 38%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcDec_rom.cpp.o
[ 39%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcDec_selectionProcess.cpp.o
[ 39%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcDec_tools.cpp.o
[ 40%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcGainDec_init.cpp.o
[ 40%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcGainDec_preprocess.cpp.o
[ 41%] Building CXX object CMakeFiles/fdk-aac.dir/libDRCdec/src/drcGainDec_process.cpp.o
[ 42%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPDec/src/tpdec_adif.cpp.o
[ 42%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPDec/src/tpdec_adts.cpp.o
[ 43%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPDec/src/tpdec_asc.cpp.o
[ 43%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPDec/src/tpdec_drm.cpp.o
[ 44%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPDec/src/tpdec_latm.cpp.o
[ 45%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPDec/src/tpdec_lib.cpp.o
[ 45%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPEnc/src/tpenc_adif.cpp.o
[ 46%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPEnc/src/tpenc_adts.cpp.o
[ 46%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPEnc/src/tpenc_asc.cpp.o
[ 47%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPEnc/src/tpenc_latm.cpp.o
[ 47%] Building CXX object CMakeFiles/fdk-aac.dir/libMpegTPEnc/src/tpenc_lib.cpp.o
[ 48%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_bitdec.cpp.o
[ 49%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_calcM1andM2.cpp.o
[ 50%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_dec.cpp.o
[ 50%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_dec_conceal.cpp.o
[ 50%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_dec_lib.cpp.o
[ 51%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_process.cpp.o
[ 52%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_qmf.cpp.o
[ 52%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_reshapeBBEnv.cpp.o
[ 53%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_rom.cpp.o
[ 53%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_smoothing.cpp.o
[ 54%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_stp.cpp.o
[ 54%] Building CXX object CMakeFiles/fdk-aac.dir/libSACdec/src/sac_tsd.cpp.o
[ 55%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_bitstream.cpp.o
[ 56%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_delay.cpp.o
[ 56%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_dmx_tdom_enh.cpp.o
[ 57%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_filter.cpp.o
[ 57%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_framewindowing.cpp.o
[ 58%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_huff_tab.cpp.o
[ 59%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_lib.cpp.o
[ 59%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_nlc_enc.cpp.o
[ 60%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_onsetdetect.cpp.o
[ 60%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_paramextract.cpp.o
[ 61%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_staticgain.cpp.o
[ 61%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_tree.cpp.o
/home/loft/fdk-aac/libSACdec/src/sac_bitdec.cpp: In function ‘SACDEC_ERROR SpatialDecParseFrameData(spatialDec_struct*, SPATIAL_BS_FRAME*, HANDLE_FDK_BITSTREAM, const SPATIAL_SPECIFIC_CONFIG*, UPMIXTYPE, int)’:
/home/loft/fdk-aac/libSACdec/src/sac_bitdec.cpp:1158:49: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
1158 | frame->tempShapeEnableChannelSTP[i] = stpEnable;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
In file included from /home/loft/fdk-aac/libSACdec/src/sac_bitdec.h:111,
from /home/loft/fdk-aac/libSACdec/src/sac_bitdec.cpp:103:
/home/loft/fdk-aac/libSACdec/src/sac_dec.h:249:9: note: at offset 2 into destination object ‘SPATIAL_BS_FRAME_struct::tempShapeEnableChannelSTP’ of size 2
249 | UCHAR tempShapeEnableChannelSTP[MAX_OUTPUT_CHANNELS]; /*!< STP side info. */
| ^~~~~~~~~~~~~~~~~~~~~~~~~
/home/loft/fdk-aac/libSACdec/src/sac_bitdec.cpp:1166:33: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
1166 | gesChannelEnable[i] = (UCHAR)FDKreadBits(bitstream, 1);
| ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/loft/fdk-aac/libSACdec/src/sac_bitdec.cpp:1163:17: note: at offset 2 into destination object ‘gesChannelEnable’ of size 2
1163 | UCHAR gesChannelEnable[MAX_OUTPUT_CHANNELS];
| ^~~~~~~~~~~~~~~~
/home/loft/fdk-aac/libSACdec/src/sac_bitdec.cpp:1167:49: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
1167 | frame->tempShapeEnableChannelGES[i] = gesChannelEnable[i];
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/loft/fdk-aac/libSACdec/src/sac_dec.h:245:9: note: at offset 2 into destination object ‘SPATIAL_BS_FRAME_struct::tempShapeEnableChannelGES’ of size 2
245 | UCHAR tempShapeEnableChannelGES[MAX_OUTPUT_CHANNELS]; /*!< GES side info. */
| ^~~~~~~~~~~~~~~~~~~~~~~~~
[ 62%] Building CXX object CMakeFiles/fdk-aac.dir/libSACenc/src/sacenc_vectorfunctions.cpp.o
[ 63%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/HFgen_preFlat.cpp.o
[ 63%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/env_calc.cpp.o
[ 64%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/env_dec.cpp.o
[ 64%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/env_extr.cpp.o
[ 65%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/hbe.cpp.o
[ 66%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/huff_dec.cpp.o
[ 66%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/lpp_tran.cpp.o
[ 67%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/psbitdec.cpp.o
[ 67%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/psdec.cpp.o
[ 68%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/psdec_drm.cpp.o
[ 69%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/psdecrom_drm.cpp.o
[ 69%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/pvc_dec.cpp.o
[ 70%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/sbr_deb.cpp.o
[ 70%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/sbr_dec.cpp.o
/home/loft/fdk-aac/libSBRdec/src/env_extr.cpp: In function ‘void sbrGetDirectionControlData(HANDLE_SBR_FRAME_DATA, HANDLE_FDK_BITSTREAM, UINT, int)’:
/home/loft/fdk-aac/libSBRdec/src/env_extr.cpp:853:39: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
853 | h_frame_data->domain_vec_noise[i] = FDKreadBits(hBs, 1);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
In file included from /home/loft/fdk-aac/libSBRdec/src/env_extr.cpp:156:
/home/loft/fdk-aac/libSBRdec/src/env_extr.h:340:9: note: at offset 2 into destination object ‘SBR_FRAME_DATA::domain_vec_noise’ of size 2
340 | UCHAR domain_vec_noise
| ^~~~~~~~~~~~~~~~
[ 71%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/sbr_ram.cpp.o
[ 71%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/sbr_rom.cpp.o
[ 72%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/sbrdec_drc.cpp.o
[ 73%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/sbrdec_freq_sca.cpp.o
[ 73%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRdec/src/sbrdecoder.cpp.o
[ 74%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/bit_sbr.cpp.o
[ 74%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/code_env.cpp.o
[ 75%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/env_bit.cpp.o
[ 76%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/env_est.cpp.o
[ 76%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/fram_gen.cpp.o
[ 77%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/invf_est.cpp.o
[ 77%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/mh_det.cpp.o
[ 78%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/nf_est.cpp.o
[ 78%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/ps_bitenc.cpp.o
[ 79%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/ps_encode.cpp.o
[ 80%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/ps_main.cpp.o
[ 80%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/resampler.cpp.o
[ 81%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/sbr_encoder.cpp.o
[ 81%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/sbr_misc.cpp.o
[ 82%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/sbrenc_freq_sca.cpp.o
[ 83%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/sbrenc_ram.cpp.o
[ 83%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/sbrenc_rom.cpp.o
[ 84%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/ton_corr.cpp.o
[ 84%] Building CXX object CMakeFiles/fdk-aac.dir/libSBRenc/src/tran_det.cpp.o
[ 85%] Building CXX object CMakeFiles/fdk-aac.dir/libPCMutils/src/limiter.cpp.o
[ 85%] Building CXX object CMakeFiles/fdk-aac.dir/libPCMutils/src/pcm_utils.cpp.o
[ 86%] Building CXX object CMakeFiles/fdk-aac.dir/libPCMutils/src/pcmdmx_lib.cpp.o
[ 87%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_bitbuffer.cpp.o
[ 87%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_core.cpp.o
[ 88%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_crc.cpp.o
[ 88%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_decorrelate.cpp.o
[ 89%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_hybrid.cpp.o
[ 90%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_lpc.cpp.o
[ 90%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_matrixCalloc.cpp.o
[ 91%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_qmf_domain.cpp.o
[ 91%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_tools_rom.cpp.o
[ 92%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/FDK_trigFcts.cpp.o
[ 92%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/autocorr2nd.cpp.o
[ 93%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/dct.cpp.o
[ 94%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/fft.cpp.o
[ 94%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/fft_rad2.cpp.o
[ 95%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/fixpoint_math.cpp.o
[ 95%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/huff_nodes.cpp.o
[ 96%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/mdct.cpp.o
[ 97%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/nlc_dec.cpp.o
[ 97%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/qmf.cpp.o
[ 98%] Building CXX object CMakeFiles/fdk-aac.dir/libFDK/src/scale.cpp.o
[ 98%] Building CXX object CMakeFiles/fdk-aac.dir/libSYS/src/genericStds.cpp.o
[ 99%] Building CXX object CMakeFiles/fdk-aac.dir/libSYS/src/syslib_channelMapDescr.cpp.o
[100%] Linking C shared library libfdk-aac.so
[100%] Built target fdk-aac
real 0m30.390s
user 1m29.432s
sys 0m42.836s
[loft@studio build]$
-Wstringop-overflow
は 未定義動作 ( 配列の添字が配列サイズを超える可能性などの領域外アクセスなど? ) の警告のようです。
もし、実際に領域外アクセスが発生したら、メモリ上のデータ破壊を破壊してしまうのでしょうね。
厳密なテストが必要ならば実装を確認したほうが良さそうです。
libfdk-aac.so
が生成されていることを確認し、ビルドは完了です。
[loft@studio build]$ ls -Fla
total 2288
drwxr-xr-x 3 loft loft 4096 Sep 15 07:48 ./
drwxr-xr-x 24 loft loft 4096 Sep 15 07:48 ../
-rw-r--r-- 1 loft loft 20142 Sep 15 07:48 CMakeCache.txt
drwxr-xr-x 7 loft loft 4096 Sep 15 07:48 CMakeFiles/
-rw-r--r-- 1 loft loft 5710 Sep 15 07:48 cmake_install.cmake
-rw-r--r-- 1 loft loft 3459 Sep 15 07:48 CPackConfig.cmake
-rw-r--r-- 1 loft loft 3894 Sep 15 07:48 CPackSourceConfig.cmake
-rw-r--r-- 1 loft loft 975 Sep 15 07:48 fdk-aac-config.cmake
-rw-r--r-- 1 loft loft 3675 Sep 15 07:48 fdk-aac-config-version.cmake
-rw-r--r-- 1 loft loft 254 Sep 15 07:48 fdk-aac.pc
lrwxrwxrwx 1 loft loft 15 Sep 15 07:48 libfdk-aac.so -> libfdk-aac.so.2*
lrwxrwxrwx 1 loft loft 19 Sep 15 07:48 libfdk-aac.so.2 -> libfdk-aac.so.2.0.3*
-rwxr-xr-x 1 loft loft 2088064 Sep 15 07:48 libfdk-aac.so.2.0.3*
-rw-r--r-- 1 loft loft 191354 Sep 15 07:48 Makefile
[loft@studio build]$
7.2.1. 参考: 並列ビルドしない場合
なお、並列ビルド を指定しない場合を確認してみると、( defaultの並列度にもよりますが、)
( 何度も計測したわけではないですが ) 下記のように 4分25秒ほどかかったので、
並列ビルドにすることで 数倍 ( 今回の場合 8~9倍 ) 速くビルドできると期待できます。この差は大きいですね。
[loft@studio build]$ time cmake --build . --config Release
[ 0%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/FDK_delay.cpp.o
[ 1%] Building CXX object CMakeFiles/fdk-aac.dir/libAACdec/src/aac_ram.cpp.o
( 略 )
[ 99%] Building CXX object CMakeFiles/fdk-aac.dir/libSYS/src/syslib_channelMapDescr.cpp.o
[100%] Linking C shared library libfdk-aac.so
[100%] Built target fdk-aac
real 4m25.511s
user 1m1.708s
sys 0m19.089s
[loft@studio build]$
8. インストール
cmake --install
により /usr/local/lib64/libfdk-aac.so
に格納されました。
[loft@studio build]$ sudo cmake --install .
-- Install configuration: "Release"
-- Installing: /usr/local/lib64/libfdk-aac.so.2.0.3
-- Installing: /usr/local/lib64/libfdk-aac.so.2
-- Installing: /usr/local/lib64/libfdk-aac.so
-- Installing: /usr/local/include/fdk-aac/machine_type.h
-- Installing: /usr/local/include/fdk-aac/genericStds.h
-- Installing: /usr/local/include/fdk-aac/FDK_audio.h
-- Installing: /usr/local/include/fdk-aac/syslib_channelMapDescr.h
-- Installing: /usr/local/include/fdk-aac/aacenc_lib.h
-- Installing: /usr/local/include/fdk-aac/aacdecoder_lib.h
-- Installing: /usr/local/lib64/pkgconfig/fdk-aac.pc
-- Installing: /usr/local/lib64/cmake/fdk-aac/fdk-aac-targets.cmake
-- Installing: /usr/local/lib64/cmake/fdk-aac/fdk-aac-targets-release.cmake
-- Installing: /usr/local/lib64/cmake/fdk-aac/fdk-aac-config.cmake
-- Installing: /usr/local/lib64/cmake/fdk-aac/fdk-aac-config-version.cmake
[loft@studio build]$
/usr/local/lib64
はデフォルトでライブラリパスに含まれていないようなので、
/etc/ld.so.conf.d/
にカスタムの設定ファイルを作成してパスを通しておきました。
[loft@studio build]$ ldconfig -p | grep fdk
[loft@studio build]$ sudo touch /etc/ld.so.conf.d/usr-local.conf
[loft@studio build]$ sudo sh -c 'echo "/usr/local/lib64" > /etc/ld.so.conf.d/usr-local.conf'
[loft@studio build]$ cat /etc/ld.so.conf.d/usr-local.conf
/usr/local/lib64
[loft@studio build]$ sudo ldconfig
[loft@studio build]$ ldconfig -p | grep fdk
libfdk-aac.so.2 (libc6,x86-64) => /usr/local/lib64/libfdk-aac.so.2
libfdk-aac.so (libc6,x86-64) => /usr/local/lib64/libfdk-aac.so
[loft@studio build]$ pkg-config --modversion fdk-aac
2.0.3
[loft@studio build]$
これで libfdk-aac.so
を利用できるようになりました。
9. ffmpeg のビルド例
configure
に下記のオプションを指定してビルド可能となります。
[loft@studio ffmpeg]$ ./configure \
( 抜粋 )
--enable-nonfree \
--enable-libfdk_aac
下記の続編では、libfdk-aac のライブラリをリンクして ffmpeg をビルドする手順や、ビルド後の ffmpeg を使用した libfdk-aac による AAC へのエンコード手順を紹介しています。
10. おまけ : 背景と所感
10.1. 背景
10.1.1. Clipchamp のAACエンコーダーによる音質劣化を感じていた
普段、SNS( Xなど ) にアップする動画を作る際には、Microsoft Clipchamp で 映像 と 音声(wav) を MP4(H.264/AAC)にしていましたが、
出力される AACのビットレートは CBR 192kbps 程度( ぱっと見、変更設定はなさそう )でしたので、
情報量の多い音楽(私の観測では、ピアノの残響を含むバンドサウンド )では特に残響の揺れや濁りを感じていました(比較動画を後述)。
10.1.2. ffmpeg内蔵AACエンコーダ で 音声ビットレートを上げて音質を劇的に改善
最初の改善として、Clipchamp は映像作成のみに使用することとし、音声(wav)と合わせて最終的な動画( MP4(H.264/AAC) )を書き出す工程では ffmpeg を使うことにしました。
その際、ffmpeg内蔵の AAC エンコーダを使用して、音声レートを高め( CBR 320kbps )に設定することで、音の揺れや濁りが改善されることを確認しました。
ご参考: CBR 320kbps で音質改善
10.1.3. 内蔵AACエンコーダーではなく、libfdk-aac を試してみたくなった
ffmpeg 内蔵エンコーダーであっても、CBR 320kbps であれば 原音ファイル( wav ) との差異はあまり感じていません。
そのため、これ以上の高音質化の必要性はそれほど高くないものと思いますが、
ffmpeg内蔵の AACエンコーダーよりも libfdk-aac が高音質である(?)との情報を目にし、
自分の耳で聴いてみたくなったので、ビルドして試してみることにしました。
10.2. 所感
厳密な音質テストをしたわけではありませんが、現状の所感を記しておきます。
前述のとおり、ffmpeg内蔵エンコーダーであっても CBR 320kbps 程度のビットレートならば、原音( wav ) との音質差異はあまり感じていません。
今回ビルドした libfdk-aac による VBR mode 5 ( -vbr 5
が最高品質? ) でエンコードしたものは、
私の試行では 平均 192kbps 程度でありながらも、原音( wav ) との音質差異はあまり感じられません。
ffmpeg 内蔵エンコーダーによる CBR 320kbps と比較すると、libfdk-aac による VBR mode 5 は、
平均ビットレートは低めでありながらも ( ファイルサイズを小さくできる )、
音質は同程度( "以上"なのか"以下"なのかは不明 ) になることは期待しても良いのかなというのが所感です。
なお、両者とも原音(wav)からの劣化が少なくエンコードできていると感じており、
SNSにアップするぐらいの用途ならばどちらでも良さそうとも思いました。
このあたりは、音響エンジニアの方がいらっしゃいましたら、是非ご意見を伺いたいところです。
なお、音質は下記の要因にも大きく左右されるので、他にも改善できる箇所を考えてみるのも良いかもしれませんね。
( 私の場合はピアノ演奏やミックスのスキルを上げるなど )
- 原曲のクオリティや条件
- 演奏
- レコーディング
- ミックス/マスタリング
- 圧縮アルゴリズムにとって阻害要因となる要素の程度(音の情報量?)
- SNSサーバー側でのエンコード条件
- 視聴環境、機材、耳の個人差
11. まとめ
WSL2 にクリーンインストールした RHEL 10.0 環境で、libfdk-aac ( Fraunhofer FDK AAC ) のライブラリを ソースコード から ビルド する手順を紹介しました。
下記の続編では、libfdk-aac のライブラリをリンクして ffmpeg をビルドする手順や、ビルド後の ffmpeg を使用した libfdk-aac による AAC へのエンコード手順を紹介しています。
本記事が快適な AAC ライフの一助になれば幸いです。