GeoffreyA
15th August 2025, 15:06
In reference to a recent discussion (https://forum.doom9.org/showthread.php?p=2021163#post2021163), I gave the repeated lossy-encoding test a go. The results are interesting, not that it matters for encoding in practice.
Except for QAAC, all encoding was done with FFmpeg, using the relevant libraries. 101 iterations were performed. QAAC and Opus seem to be the winners, though neither escapes unscathed. Warning for your ears in all cases except QAAC, FDK, and Opus!
https://workupload.com/archive/ARup4FAjnQ
ffmpeg -i REF.flac -c:a aac -b:a 128k a.m4a
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.m4a -c:a copy tmp.m4a
ffmpeg -y -i tmp.m4a -c:a aac -b:a 128k a.m4a
)
/////////////////////////////////////////////////////////////////////////
zzffmpeg -i REF.flac -c:a libfdk_aac -b:a 128k a.m4a
for /l %%x in (1, 1, 100) do (
zzffmpeg -y -i a.m4a -c:a copy tmp.m4a
zzffmpeg -y -i tmp.m4a -c:a libfdk_aac -b:a 128k a.m4a
)
/////////////////////////////////////////////////////////////////////////
d:\tmp\av\qaac\qaac64 --cbr 128 REF.flac -o a.m4a
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.m4a -c:a copy tmp.m4a
d:\tmp\av\qaac\qaac64 --cbr 128 tmp.m4a -o a.m4a
)
/////////////////////////////////////////////////////////////////////////
d:\tmp\av\qaac\qaac64 --tvbr 64 REF.flac -o a.m4a
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.m4a -c:a copy tmp.m4a
d:\tmp\av\qaac\qaac64 --tvbr 64 tmp.m4a -o a.m4a
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libopus -b:a 128k a.opus
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.opus -c:a copy tmp.opus
ffmpeg -y -i tmp.opus -c:a libopus -b:a 128k a.opus
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libopus -b:a 128k -vbr constrained a.opus
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.opus -c:a copy tmp.opus
ffmpeg -y -i tmp.opus -c:a libopus -b:a 128k -vbr constrained a.opus
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libmp3lame -b:a 128k a.mp3
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.mp3 -c:a copy tmp.mp3
ffmpeg -y -i tmp.mp3 -c:a libmp3lame -b:a 128k a.mp3
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libtwolame -b:a 128k a.mp2
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.mp2 -c:a copy tmp.mp2
ffmpeg -y -i tmp.mp2 -c:a libtwolame -b:a 128k a.mp2
)
The test is not rigorous, and these were separate scripts that I pasted together above.
Except for QAAC, all encoding was done with FFmpeg, using the relevant libraries. 101 iterations were performed. QAAC and Opus seem to be the winners, though neither escapes unscathed. Warning for your ears in all cases except QAAC, FDK, and Opus!
https://workupload.com/archive/ARup4FAjnQ
ffmpeg -i REF.flac -c:a aac -b:a 128k a.m4a
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.m4a -c:a copy tmp.m4a
ffmpeg -y -i tmp.m4a -c:a aac -b:a 128k a.m4a
)
/////////////////////////////////////////////////////////////////////////
zzffmpeg -i REF.flac -c:a libfdk_aac -b:a 128k a.m4a
for /l %%x in (1, 1, 100) do (
zzffmpeg -y -i a.m4a -c:a copy tmp.m4a
zzffmpeg -y -i tmp.m4a -c:a libfdk_aac -b:a 128k a.m4a
)
/////////////////////////////////////////////////////////////////////////
d:\tmp\av\qaac\qaac64 --cbr 128 REF.flac -o a.m4a
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.m4a -c:a copy tmp.m4a
d:\tmp\av\qaac\qaac64 --cbr 128 tmp.m4a -o a.m4a
)
/////////////////////////////////////////////////////////////////////////
d:\tmp\av\qaac\qaac64 --tvbr 64 REF.flac -o a.m4a
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.m4a -c:a copy tmp.m4a
d:\tmp\av\qaac\qaac64 --tvbr 64 tmp.m4a -o a.m4a
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libopus -b:a 128k a.opus
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.opus -c:a copy tmp.opus
ffmpeg -y -i tmp.opus -c:a libopus -b:a 128k a.opus
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libopus -b:a 128k -vbr constrained a.opus
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.opus -c:a copy tmp.opus
ffmpeg -y -i tmp.opus -c:a libopus -b:a 128k -vbr constrained a.opus
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libmp3lame -b:a 128k a.mp3
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.mp3 -c:a copy tmp.mp3
ffmpeg -y -i tmp.mp3 -c:a libmp3lame -b:a 128k a.mp3
)
/////////////////////////////////////////////////////////////////////////
ffmpeg -i REF.flac -c:a libtwolame -b:a 128k a.mp2
for /l %%x in (1, 1, 100) do (
ffmpeg -y -i a.mp2 -c:a copy tmp.mp2
ffmpeg -y -i tmp.mp2 -c:a libtwolame -b:a 128k a.mp2
)
The test is not rigorous, and these were separate scripts that I pasted together above.