Как стать автором
Обновить

Полмегабайта пустоты в каждом файле Apple Music

Разработка под iOS *Хранение данных *Звук
Перевод
Автор оригинала: Daniel Aleksandersen

Вы когда-нибудь докупали расширенный объём хранилища для iPod, iPhone или Mac, чтобы иметь больше места для своей цифровой коллекции музыки Apple Music (iTunes)? Возможно, вы заполняли его гигабайтами пустого пространства.

Музыкальные файлы, которые вы покупаете в Apple Music Store (AMS; ранее назывался iTunes Music Store) содержат приблизительно 6% цифрового аналога пустоты. Я говорю не о тишине, а о сплошных блоках пустого пространства, находящихся внутри файлов. Они нужны только для того, чтобы заполнять файлы, делая их на 0,5 МБ больше. Так зачем же Apple делает музыкальные файлы излишне большими? И как вернуть впустую занимаемое пространство?

Эта статья будет довольно технической, и рассматриваемые в ней темы требуют небольшого объяснения. Можете пропустить первые 14 абзацев, если вас интересует только «почему», или пропустить первые 17 абзацев, если вам интересно, как вернуть это пространство.

Приобретаемые в AMS музыкальные файлы кодируются Advanced Audio Codec (AAC) с помощью Apple AAC Encoder. Файлы передаются в контейнере ISOBMFF (ISO 14496-1). Этот формат контейнера используется для различных медиафайлов, в том числе для звука, изображений и фильмов. Формат контейнера имеет много возможностей для реализации, что позволяет создавать разные странные особенности.

Контейнеры ISOM разделены на различные блоки данных: сам мультимедийный поток, метаданные (подробности кодирования, имя исполнителя, обложка альбома, информация о нормализации громкости и т. п.) и пустое пространство. Есть и другие блоки, но в этой статье нас интересуют только эти три.

Эти разделы могут быть выстроены в файле в любом порядке. Однако в некоторых ситуациях определённый порядок может вызывать различные побочные эффекты. Например, если поместить блок метаданных в конец файла, то прежде чем воспроизвести композицию, необходимо будет скачать её (или считать с локального накопителя) целиком. Чтобы избежать этого, кодировщики обычно размещают его перед более объёмным блоком мультимедийного потока. Блок метаданных обращается к абсолютным позициям внутри блока мультимедийного потока, измеряемым как смещение от начала файла. В метаданные нельзя вносить изменения (например, изменять написание имени исполнителя) без повторной сборки всего файла для пересчёта смещений.

Чтобы обойти эту проблему, кодировщики обычно оставляют пустое пространство между блоками метаданных и мультимедийного потока. В контейнере ISOM этот блок называется «свободным» (free) блоком. Эти блоки содержат только нулевые байты. Если вы измените, например, название альбома, то Apple Music сможет расширить блок метаданных и уменьшить свободный блок без необходимости перемещать блок мультимедийного потока. Это довольно удобно.

Если рипнуть CD при помощи Apple Music, воспользовавшись Apple AAC Encoder (опция по умолчанию), он зарезервирует для этой цели приблизительно по 5 КБ свободного пространства в каждом файле. Этого достаточно, чтобы добавить примерно 1250 эмодзи в метаданные каждой из композиций. Такого объёма должно вполне хватить на любые изменения, которые были бы необходимы в метаданных. Если же вам всё-таки нужно будет добавить больше данных, то позже музыкальный файл можно будет пересобрать заново, чтобы расширить пространство метаданных. Эта операция займёт чуть больше времени, но это будет приемлемым компромиссом, чтобы не тратить слишком много места на накопителе.

Однако покупаемые в Apple Music Store музыкальные файлы содержат приблизительно 500  КБ (0,5 МБ) свободного места. Это в 100 раз больше, чем место, выделяемое Apple Music в композициях, которые вы рипнули самостоятельно. А ещё это гораздо больший объём под метаданные, чем вам когда-либо понадобится.

В моей библиотеке Apple Music есть 2500 композиций, купленных мной в AMS, и почти такое же количество рипнутых файлов. Они закодированы с одинаковыми настройками качества. Проанализировав свою коллекцию, я выяснил, что купленные в AMS композиции в среднем на 7% больше рипнутых. 6% этой разницы составляет пустое пространство (суммарно 1,25ГБ). В рипах пустое пространство занимает лишь 0,005% от места в хранилище.

Я проанализировал выборку музыкальных файлов iTunes Store, купленных в 2010 и 2020 годах, все они имеют одинаковую структуру с одинаковым количеством лишнего пустого пространства. Скорость канала и ёмкость хранилища десять лет назад были дороже, поэтому тогда проблема была ещё более серьёзной.

Классическая файловая система Apple HFS+ не поддерживала разреженное хранение. Разреженное хранение (Sparse storage) — это методика хранения в файловой системе, которая может использоваться для сжатия последовательных блоков нулевых байтов при записи файлов. Вместо записи отдельных нулевых байтов на накопитель файловая система записывает, сколько есть повторяющихся нулевых байтов.

Новая Apple File System (APFS) поддерживает разреженное хранение, но Apple Music не использует это свойство и записывает все нулевые байты на накопитель. Я попытался перезаписать свою коллекцию музыки с учётом разреженности, и смог ужать её на 5,2%. Разреженное хранение может снизить требования к объёму накопителя локального компьютера. Однако оно не снизит затраты на услуги хранения резервных копий онлайн и не поможет, когда программы, не знающие о возможности разреженного хранения (например, Apple Music) модифицируют файлы или синхронизируют их с устройствами Apple.

Я уже пару раз говорил, что мы можем пересобрать музыкальные файлы. Если вам хочется вернуть себе пространство, то это можно сделать, пересобрав файлы при помощи кодировщика, который оставляет не так много свободного места, как AMS. Стоит заметить, что пересборка музыкального файла (иногда называемая remuxing) не включает в себя перекодирование блока мультимедийного потока. На практике это означает, что такая операция не приводит к потерям данных в мультимедийной части файла.

Прежде чем я объясню, как выполнить remux пустого пространства из музыки, нужно сказать о том, почему оно вообще там появляется. Как говорилось выше, кодировщики часто резервируют небольшой блок пустого пространства, чтобы можно было изменять метаданные без пересборки всего файла при каждом изменении. Также я говорил, что в разделе метаданных хранится обложка альбома.

Однако AMS не хранит обложку диска внутри каждого музыкального файла. Начиная с iTunes 7 (выпущенной в сентябре 2006 года), приложение стало хранить файлы обложек альбомов отдельно от музыкальных файлов. Согласно данным TUAW, это изменение связано с реализацией эффектной новой функции перелистывания альбомов под названием Cover Flow

Я могу только предполагать, что блок в 500 КБ изначально резервировался под обложку альбома. Серверы Apple должны вставлять его на лету в метаданные в момент передачи. Внешний вид обложки одного альбома может отличаться для разных регионов, поэтому, наверно, это логично? К тому же одна песня может быть частью разных альбомов. Возможно, Apple хранит только одну копию и вставляет метаданные на лету? Когда обложку альбома убрали, похоже, никто в Apple не вспомнил, что нужно уменьшить размер блока метаданных.

Точно я не знаю, но это единственное разумное объяснение, которое я могу придумать. Есть и более зловещая версия — возможно, Apple хотела мотивировать людей перейти на более дорогие iPod и Mac с большим объёмом накопителя. Отделение графики обложек от музыкальных файлов также можно считать действием, усложняющим потребителям перенос коллекций музыки на конкурирующие плееры.

Ниже будет рассказано о внесении изменений в коллекцию музыкальных файлов. Прежде чем выполнять эти инструкции, создайте резервную копию коллекции.

Прежде чем двигаться дальше, вам нужно снова встроить обложки альбомов в музыкальные файлы. Описанный ниже процесс изменяет музыкальные файлы, и iTunes может запутаться в соответствии обложек и файлов. Встраивание обложки решает эту проблему, а также позволит воспроизводить музыку в любом другом музыкальном приложении. Чтобы за раз изменить всю музыкальную коллекцию, можно воспользоваться Re-Embed Artwork для MacOS.

Вы можете заметить, что большинство композиций после встраивания обложек не увеличивается в размерах. Обложка альбома отлично помещается в пустое пространство, уже зарезервированное внутри каждого файла. Чтобы восстановить оставшееся пустое место внутри музыкальных файлов, нужно будет выполнить remux каждого файла с помощью FFmpeg.

Начнём с установки Homebrew, а затем используем его, чтобы установить findutils и ffmpeg. Установив эти зависимости, вы сможете запустить следующую цепочку скриптов в приложении Terminal. Выделите строку целиком и вставьте её в терминал.

find ~/Music/ "(" -name "*.m4a" -and -not -name ".*" ")" -print0 | xargs -0 -P4 -n1 sh -c 'ffmpeg -y -i "$0" -movflags +faststart -map 0 -c copy "$0.tmp.m4a" && mv "$0.tmp.m4a" "$0"'

Она найдёт все музыкальные файлы в папке Music (с помощью команды find), и применит нужную обработку с помощью ffmpeg. Эта операция выполняется без потерь и качество звука не снизится. Стоит заметить, что в процессе будут потеряны некоторые относящиеся к iTunes метаданные (информация о покупке). Из-за этого в дальнейшем могут возникнуть проблемы в iTunes, если вы сначала не встроили в файлы обложки альбомов.

Я всегда выбирал продукты Apple с самым маленьким накопителем и до краёв заполнял их музыкой. Очень жаль, что я мог бы поместить в эти устройства ещё на 6% больше музыки, если бы Apple не заполняла файлы нулевыми байтами! Я не считаю, что это злонамеренное действие со стороны Apple. Вероятно, это была ошибка инженера, остававшаяся незамеченной более десятка лет и так и не устранённая.
Теги:
Хабы:
Всего голосов 82: ↑82 и ↓0 +82
Просмотры 51K
Комментарии Комментарии 49