Добавление метаданных в сгенерированный аудиофайл

Я программно создаю аудиофайл и хочу добавить к нему метаданные, например название и имя исполнителя. Мне все равно, в каком формате записан файл, лишь бы AVPlayer его прочитал и отправил на проигрывающее устройство. (Вся цель состоит в том, чтобы отправить этот сгенерированный звук и название его дорожки на устройство Bluetooth. Я рад изучить более простые способы достижения этого на iPhone, которые не требуют записи файла или добавления метаданных непосредственно в файл.)

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

let writer = try AVAssetWriter(outputURL: output, fileType: .aiff)  
let title = AVMutableMetadataItem()  
title.identifier = .commonIdentifierTitle  
title.dataType = kCMMetadataBaseDataType_UTF8 as String  
title.value = "The Title" as NSString  
writer.metadata = [title]  
// setup the input and write the file.  

Я не нашел ни одной комбинации идентификаторов или типов файлов (которые я действительно могу сгенерировать), которые будут включать эти метаданные в файл.

Мой текущий подход состоит в том, чтобы создать файл как AIFF, а затем использовать AVAssetExportSession, чтобы переписать его как m4a. Используя это, я смог добавить достаточно метаданных, чтобы iTunes отобразил заголовок. Однако «Информация о файле» Finder не может прочитать заголовок (что он делает для файлов iTunes m4a). Я предполагаю, что если он даже не отображается в информации о файле, он не будет отправлен по Bluetooth (я скоро проверю это, но у меня нет нужного мне оборудования).

Изучая файлы iTunes m4a, я обнаружил некоторые теги, которые не могу воссоздать с помощью AVMetadataItem. Например, имя сортировки (sonm). Я не знаю, как писать теги, которые не являются одним из известных идентификаторов (и я протестировал все 263 AVMetadataIdentifier).

На этом фоне мои основные вопросы:

  • Какие теги метаданных считываются AVPlayer и отправляются на устройства Bluetooth (например, AVRCP)?
  • Можно ли записать метаданные непосредственно с помощью AVAssetWriter в формат файла, который поддерживает Linear PCM (или какой-либо другой формат, который легко генерировать)?
  • Учитывая известный тег/значение, которое не соответствует ни одному из AVMetadataIdentifiers), можно ли записать его в AVAssetExportSession?

Позже я рассмотрю сторонние фреймворки id3, но я хотел бы добиться этого с помощью AVFoundation (или другого встроенного фреймворка), если это возможно.


person Rob Napier    schedule 02.03.2018    source источник
comment
Если я правильно помню, это как-то связано с форматом value. Я не уверен, что вы не должны помещать туда Data (строка в кодировке utf8). Также не забудьте установить keySpace.   -  person Sulthan    schedule 02.03.2018
comment
Одна идея - возможно ли, что информация о заголовке, передаваемая AVRCP, отправляется через MPNowPlayingInfoCenter nowPlayingInfo? AVPlayer зная так много о профилях Bluetooth, я немного пугаюсь.   -  person Rhythmic Fistman    schedule 02.03.2018
comment
@Султан Спасибо; да, я пробовал это. Я не думаю, что это проблема, поскольку я могу заставить его хранить метаданные в m4a (через экспорт) без преобразования в данные.   -  person Rob Napier    schedule 02.03.2018
comment
@RhythmicFistman Через Твиттер, я думаю, вы действительно кое-что поняли. Это будет мое следующее исследование. Еще раз спасибо. twitter.com/cocoaphony/status/969610237761159168   -  person Rob Napier    schedule 02.03.2018
comment
эй @RobNapier какое решение? :)   -  person Pablo Martinez    schedule 02.07.2018
comment
@PabloMartinez В конечном итоге мой вариант использования был невозможен. Вы должны ненадолго захватить аудиосеанс, что приводит к падению iTunes примерно на секунду, но заставляет проигрыватели, не относящиеся к iTunes (например, Spotify), приостанавливаться и никогда не возобновлять. Этот пользовательский опыт был слишком плохим, и нам пришлось отказаться от этого подхода. (Моей целью никогда не было писать этот файл; на самом деле я должен был установить информацию «Сейчас исполняется» для устройств Bluetooth.)   -  person Rob Napier    schedule 02.07.2018


Ответы (1)


Я смог использовать AVAssetWriter для хранения значений метаданных в файле .m4a, используя ключевое пространство iTunes:

let songID = AVMutableMetadataItem()
songID.value = "songID" as NSString
songID.identifier = .iTunesMetadataSongID

let songName = AVMutableMetadataItem()
songName.value = "songName" as NSString
songName.identifier = .iTunesMetadataSongName

Вы можете записывать сжатые файлы .m4a напрямую, используя AVAssetWriter, указав правильные настройки при настройке входного объекта, поэтому нет необходимости использовать промежуточный файл AIFF.

person Patrick Beard    schedule 12.08.2018