Как редактировать AVMutableComposition несколько раз

Я снова ищу помощи с AVFoundation. Извините за мой не идеальный английский.

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

AVMutableComposition *mixComposition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                           preferredTrackID:kCMPersistentTrackID_Invalid];

[track insertTimeRange:CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(startOfEditedFrame, 600))
                           ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:&error];

[track insertTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(startOfEditedFrame, 600), CMTimeMakeWithSeconds(endOfEditedFrame, 600))
                           ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:nil];

[track scaleTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(startOfEditedFrame, 600), CMTimeMakeWithSeconds(endOfEditedFrame, 600))
                    toDuration:CMTimeMultiplyByFloat64(CMTimeMakeWithSeconds(endOfEditedFrame - startOfEditedFrame, 600), 1/[self.speeds[self.currentFrameStartIndex] floatValue])];

[track insertTimeRange:CMTimeRangeFromTimeToTime(CMTimeMakeWithSeconds(endOfEditedFrame, 600), self.videoAsset.duration)
                           ofTrack:[self.videoAsset tracksWithMediaType:AVMediaTypeVideo][0] atTime:mixComposition.duration error:nil];

self.videoAsset = mixComposition;

В первый раз все работает нормально, но во второй раз у меня возникают ошибки "insertTimeRange" и нулевая продолжительность композиции. Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи, что здесь идет не так, или какие-либо предложения, как сделать это по-другому/правильнее.


person user2903218    schedule 05.02.2014    source источник
comment
Я столкнулся с той же проблемой. Вы нашли решение?   -  person Reckoner    schedule 13.08.2016


Ответы (2)


Похоже, у меня есть решение этой проблемы. Вы не можете редактировать AVMutableComposition несколько раз, как вы пытались.

Это будет работать нормально в первый раз, потому что прямо сейчас это AVAsset, который вы создали из URL-адреса (любого URL-адреса). Таким образом, после того, как вы впервые отредактируете, актив изменит свою форму. Он больше не останется AVAsset но теперь это AVMutableComposition. Поэтому вам нужно экспортировать композицию с новым URL-адресом, а затем создать новый AVAsset с этим URL-адресом, а затем выполнить этот код для этого актива, и он определенно сработает. .

Уточненная причина: Вот несколько советов, которые помогут вам понять каждую деталь.

1. Когда вы пытаетесь изменить объект несколько раз без экспорта.
Это так выглядит ресурс, когда вы впервые его редактируете.

    <AVURLAsset: 0x7ff6404736c0, URL = file:///Users/puneetgurtoo/Library/Developer/CoreSimulator/Devices/8CC36C99-62B4-47F4-82BB-205DFE93FD96/data/Containers/Data/Application/26EFAB87-EA98-47DD-B7D9-A28CEE0DA043/Documents/28DBF785-58A4-4F3D-9AF0-77E300D89658-1595-000008AB6974EF7A.mov>

Но когда вы выполнили над ним операцию редактирования, после этого он становится примерно таким:

    AVMutableComposition: 0x7ff640403e50 tracks = (
"<AVMutableCompositionTrack: 0x7ff64046bb90 trackID = 1, mediaType = vide, editCount = 1>",
"<AVMutableCompositionTrack: 0x7ff64046c490 trackID = 2, mediaType = soun, editCount = 1>"
)>

Вот где возникает проблема.

2. Поэтому, когда вы экспортируете AVMutableComposition с новым URL-адресом, просто создайте новый экземпляр AVAsset с этим URL-адресом, и проблема будет решена.

Я опубликую ссылку на демо-версию того же позже сегодня. А пока вы можете пройти эту концепцию.

person Reckoner    schedule 13.08.2016
comment
Привет! Есть новости о демо-проекте? :) - person Roi Mulia; 07.08.2017
comment
Обязательно опубликую это завтра. Но проверьте мой ответ, вот в чем проблема. - person Reckoner; 10.08.2017
comment
Спасибо Реконер! Я загружаю свой актив через AVAsset, а не через AVUrlAsset, так что это немного отличается. Но ваш пример, безусловно, поможет мне лучше понять это :) - person Roi Mulia; 10.08.2017
comment
Под капотом AVAsset использует только AVURLAsset. Могут быть некоторые различия, но это почти одно и то же. Просто прочитайте немного об обоих классах, и я уверен, что вы получите некоторое представление. Я предоставлю вам демонстрация в течение 24 часов. Так что это поможет вам получить полное представление об этой концепции. - person Reckoner; 10.08.2017
comment
Удивительный. Спасибо за помощь :) Прочитаю и про них обоих :) - person Roi Mulia; 10.08.2017
comment
Есть новости о демо-проекте? :) :) - person Roi Mulia; 07.09.2017
comment
Извините, @RoiMulia Вот ссылка на GitHub: github.com/Reckoner1710/AVMutableCompositionMultipleEditConcept - person Reckoner; 28.12.2017

Один из советов, который я могу вам дать, — посмотреть заголовочный файл AVMutableComposition.

В комментариях к методу insertTimeRange говорится о параметре track:

«Указывает ресурс, содержащий дорожки, которые необходимо вставить. Поддерживаются только экземпляры AVURLAsset».

Таким образом, дорожки, которые вы вставляете из дорожек, должны относиться к классу "AVURLAsset" и только к этому классу.

Надеюсь, это поможет некоторым.

person yairsz    schedule 02.04.2014