Прикрепить пользовательский миниатюры для видео (не извлечение) - IOS, AVFoundation

Я генерирую видео с помощью AVFoundation. После этого я пишу видео в библиотеку Photos, используя Photos Framework (и после этого получаю экземпляр PHAsset).

Я хочу установить пользовательскую миниатюру для добавления PHAsset (последний кадр из видео), но не может найти решение. Как добавить пользовательскую эскизную копию для добавления видео? Я хочу увидеть свое пользовательское эскиз в приложении "Фотографии", когда я откроюсь.

Кроме того, я знаю, как получить изображение из видео с помощью AVAssetImageGenerator, но я хочу увидеть его миниатюру в приложении "Фото".

Ответы

Ответ 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-кодер, - записать байты в существующий файл и повторно сохранить как новое имя файла (или перезаписывать, когда код улучшен).

Ответ 2

Если вы пишете часть приложения, которое будет просматривать библиотеку фотографий и отображать миниатюры, вы должны сделать это следующим образом:

  • получить PHAsset
  • из запроса PHASset AVasset с использованием requestAVAssetForVideo
  • генерировать эскиз в то время, когда вам нужно использовать AVAssetImageGenerator и метод copyCGImageAtTime

Одна вещь, о которой следует опасаться, заключается в том, что выбор времени и выбор определенного кадра в видео - это сложная наука/искусство - получение именно того кадра, который вы хотите от времени, может оказаться трудным.

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

Если вы говорите, что хотите, чтобы видео появлялись в стандартном приложении "Фотографии" на iOS с настраиваемой миниатюрой, которую вы им назначили, я не уверен, как вы можете это сделать.