Ответ 1
Чтобы добавить пользовательский миниатюру в MP4:
МЕТОД 1: используя AVMutableMetadataItem...
Посмотрите, помогает ли код в этом Вопрос.
AVMutableMetadataItem *item = [[AVMutableMetadataItem alloc] init];
item.keySpace = AVMetadataKeySpaceCommon;
item.key = AVMetadataCommonKeyArtwork;
item.value = UIImageJPEGRepresentation([[UIImage alloc] initWithContentsOfFile:[[NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@".image"]]);
[newMetadataArray addObject:item];
assetWrtr.metadata = newMetadataArray;
[assetWrtr startWriting];
[assetWrtr startSessionAtSourceTime:kCMTimeZero];
См. также форум Apple Сообщение. Прочитайте весь поток для контекста кода и использования.
МЕТОД 2: ручная запись байтов...
Краткая версия:
Найдите следующие атомы (теги)... moov
переходит в udta
переходит в meta
, затем ilst
, и здесь просто добавьте атом covr
(24 байта), за которым следуют байты вашего jpeg-изображения (байты FF D8
до FF D9
). Обновите записи размера (32-разрядные целые числа) для moov
, udta
, ilst
и covr
, чтобы отразить вновь добавленные байты). Это. Законченный.
Расширенная версия:
(note
/recommended
):
• В идеале проверьте тест MP4 в шестнадцатеричном редакторе (d/load a free), чтобы следовать байтам, как описано ниже.
• Читайте: Характеристики Apple Quicktime Format и Система Cimmaron System MP4 атомов.
1) Найти
moov
байт...
(при просмотре в шестнадцатеричном редакторе) Ваши байты MP4 должны выглядеть примерно так.
00 00 00 20 66 74 79 70 69 73 6F 6D 00 00 02 00 ... ftypisom....
69 73 6F 6D 69 73 6F 32 61 76 63 31 6D 70 34 31 isomiso2avc1mp41
00 00 00 08 66 72 65 65 00 00 99 70 6D 64 61 74 ....free..™pmdat
Это начальные байты, а важная часть - это то, что имеет байты 6D 64 61 74
, что означает mdat
(в виде символов ASCII, справа от показанных байтов Посмотреть). Я не использую iOS, поэтому я надеюсь, что он сначала сделает mdat
, а затем moov
помещен в конец файла, в этом случае легко добавить дополнительные байты без искажения файла. Если вы видите mdat
в первых 64 байтах вашего файла, вы можете продолжить мой совет ниже.
edit: (если это уже не так по умолчанию) Кажется, вы можете разместить атом mdat
перед файлом (первые 64 байта), если ваши настройки exportSession
:
exportSession.shouldOptimizeForNetworkUse = NO;
Чтобы найти moov
, прочитайте предыдущие 4 байта (как одно целое) перед буквами ASCII "mdat". В приведенном выше примере это 4-байтовое целое число 00 00 99 70
(= 39280 байт). Это означает, что пропускает в общей сложности байты 39280 + 8, начиная с 6D
.. 64
.. 61
и так далее. После пропусков следующие 4 байта должны быть 6D 6F 6F 76
( "moov" в ASCII). Обратите внимание на это смещение/положение как начало moov.
2) Добавьте
covr
байт...
От начала moov, прочитайте следующие байты, которые ищут:
- найти запись
udta
как байты75 64 74 61
. Примечание для последующей ссылки:this position - 4
как начало udta size pos. - найти запись
meta
как байты6D 65 74 61
. - найдите запись
ilst
как байты69 6C 73 74
. Примечание для последующей ссылки:this position - 4
как начало ilst size pos.
Примечание. Если какая-либо из вышеперечисленных записей не найдена, вы должны создать эти байты. Отметьте страницу 14 этого atom guide, чтобы узнать, какие байты (значения) необходимы для указанных выше атомов.
- в конце
ilst
добавьте четыре нуля байта00 00 00 00
(позже это будет обновлено как общийcovr
размер). Для справки обратите внимание на положение этих 4 байтов как covr size pos. - добавить запись
covr
, написав bytes/integer как63 6F 76 72
. - добавить байты
00 00 ED EA 64 61 74 61 00 00 00 0D 00 00 00 00
, затем он готов к байтам изображения JPEG.
3) Добавить байты JPEG...
Вставьте байты изображения JPEG. Эти байты начинаются с FF D8
и заканчиваются на FF D9
. Обратите внимание на общую сумму этих байтов как jpeg size.
4) Обновить размеры...
- для
covr
: перейдите к началу covr size pos, замените четыре байта00 00 00 00
шестнадцатеричным результатомjpeg size + 20
расчет. - для
ilst
: перейдите к началу ilst size posбайты, замените эти четыре байта шестнадцатеричным результатом вычисленияcurrent ilst size + covr size + 4
. - для
udta
: перейдите к началу байтов udta size pos, замените эти четыре байта шестнадцатеричным результатомcurrent udta size + covr size + 4
расчет..
вывод
Протестируйте файл MP4, включив в своей программе/инструменте несколько миниатюр. Вы должны увидеть, что jpg теперь используется как значок для отредактированного файла mp4.
PS: Я не кодирую для iOS (нет Swift
или Objective-C
знаний), поэтому я не могу показать вам пример кода, только советы по созданию байтов. Эта задача может быть выполнена вручную с помощью шестнадцатеричного редактора. Главное для вас, как iOS-кодер, - записать байты в существующий файл и повторно сохранить как новое имя файла (или перезаписывать, когда код улучшен).