An attempt at RIIR-ing the native AAC encoder from ffmpeg.
First, I used c2rust to translate all relevant C code into Rust, and I'm in the process of re-writing it in a more Rust-y way, bit-by-bit.
The resultant library can be used in lieu of the native ffmpeg AAC encoder, and produces reasonable (to my ears) AAC-encoded audio.
Most of the code is still the C code translated verbatim into Rust, and I'm pretty certain I introduced bugs and mistakes in the code I did translate (I don't really know anything about audio encoding 😳).
First:
cargo buildIn order to build ffmpeg with this library instead of the native one, after cloning the ffmpeg repo the following changes must be changed to the configuration and build files:
-
Comment out building the C obj files for the native encoder in
libavcodec/Makefile:# OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o aacenctab.o \ # aacpsy.o aactab.o \ # aacenc_is.o \ # aacenc_tns.o \ # aacenc_ltp.o \ # aacenc_pred.o \ # psymodel.o kbdwin.o \ # mpeg4audio_sample_rates.o
-
Run
./configureand then alter the resultantffbuild/config.makin order to link theffmpegbinary againstraash. Change the following line:EXTRALIBS-avcodec=-pthread -lm -latomicto:
EXTRALIBS-avcodec=-pthread -lm -latomic -L/path/to/raash/target/debug -l:libraash.a
Now you can run make and then try to encode a file to AAC using your newly built ffmpeg:
./ffmpeg -i my_audio_file.wav -f adts my_audio_file.aac