Как создать AVMutableMetadataItem для AVMetadataFormatiTunesMetadata

Я пытаюсь обновить количество дорожек файлов с помощью AVMutableMetadataItem's. У меня был некоторый успех за исключением AVMetadataFormatiTunesMetadata. Я не могу понять, что мне нужно установить в качестве значения, чтобы заставить это работать. Я попытался создать архив NSArray следующим образом

[NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:
    [NSNumber numberWithUnsignedInt:13],
    [NSNumber numberWithUnsignedInt:32],
    nil]];

Но я получаю трек и трек номеров, которые еще далеко. Что именно я должен передавать в качестве значения для AVMutableMetadataItem с ключом AVMetadataiTunesMetadataKeyTrackNumber?

2 ответа

Решение

Мне потребовалось очень много времени, чтобы понять это. Благодаря документации Apple Core Audio, в которой абсолютно ничего не говорится о том, как с этим бороться. Или любой другой ключ в этом отношении. Мне пришлось изучить файл MP4 с информацией о треках, прежде чем я понял.

Ответ

Вам нужно назначить его с NSData, содержащим информацию о дорожке.

Данные должны состоять из четырех 16-битных значений с прямым порядком байтов, в то время как 2-е - это номер дорожки, а 3-е - это общее количество дорожек в коллекции. 1 и 4 должны быть равны нулю.

Так что в основном вам нужно сделать это

int16_t trackNumber = 1; // track number
int16_t tracksInCollection = 12; // total number of tracks in collection
int16_t data[4] = { 0, trackNumber, tracksInCollection, 0 };

metadataItem.keySpace = AVMetadataKeySpaceiTunes;
metadataItem.key = AVMetadataiTunesMetadataKeyTrackNumber;
metadataItem.value = [NSData dataWithBytes:data length:sizeof(data)];

Примечание. Тот же подход применяется для ключа AVMetadataiTunesMetadataKeyDiscNumber.

Замечания о порядке байтов

Если вы не хотите беспокоиться о порядке следования байтов, вы можете "позаимствовать" методы из API сокетов Беркли. Или это может быть макрос. Во всяком случае, это работает так:

bigendianval = htons(val);

или же

int16_t trackNumber = htons(myTrackNumberVariable);

htons (Коротко отхоста к сети) преобразует ваши 16-битные числа в старшие порядковые номера - независимо от порядкового номера вашей собственной системы. IP-сети также являются big-endian, и поэтому htons здесь можно использовать повторно.

Аналогично для номера диска:

AVMutableMetadataItem *metaItem = [AVMutableMetadataItem metadataItem];
metaItem.key=@1684632427;

int16_t diskNumber = htons([dict[@"discNumber"]intValue]);
int16_t disksInCollection = htons([dict[@"discCount"]intValue]);
int16_t data[3] = {0, diskNumber, disksInCollection};
metaItem.value=[NSData dataWithBytes:data length:sizeof(data)];
metaItem.keySpace=AVMetadataKeySpaceiTunes;
Другие вопросы по тегам