Поясню почему работает System.out.println(new String(id3v2Tag.getAlbum().getBytes(«Latin1»))).
Как я понимаю, вы используете некую библиотеку, которая умеет читать id3-теги.
Эта библиотека из файла читает сырой массив байт. Ей надо преобразовать байты в строку, для этого надо воспользоваться какой-то кодировкой. В идеале, эту кодировку надо бы задавать в настройках библиотеки. Но если кодировка не задана, то, видимо, используется Latin1.
Так вот, библиотека преобразует байты в строку с помощью Latin1. Происходит это так, берётся некий байт, ему ставится в соответствие некий символ и он сохраняется в строке. Например, считали байт, представляющий букву «А» в кодировке windows-1251, а в Latin1, этому байту будет сопоставлен какой-нибудь "Õ". Если вы преобразуете такую строку в массив байт, используя UTF-8 и запишете байты в файл, то при просмотре файла в UTF-8 вы не увидите русских букв.
Далее, вы хотите распечатать строку, для этого вы преобразуете её в байты используя Latin1. Символу "Õ" сопоставляется байт, который в windows-1251 представляет букву «А». Потом из этих байт опять создаётся строка, при этом
используется системная кодировка по умолчанию — windows-1251. В результате, из байта получается символ «А», как и было задумано, и эта строка корректно выводится на экран.
Как поступить: в 1-м комменте дали ссылку на нужную вам библиотеку. Вам надо получать теги в виде массива байт, и преобразовывать их в строки, используя определённую juniversalchardet кодировку. Если библиотека для работы с MP3 не позволяет получить теги в виде массивов байт, то преобразовывать возвращаемые ей значения в байты используя Latin1, а лишь потом определять кодировку и создавать строки.