Только первый трек воспроизведения AVMutableComposition ()

Новое редактирование ниже

Я уже ссылался

AVMutableComposition - только воспроизведение первого трека (Swift)

но это не дает ответа на то, что я ищу.

у меня естьAVMutableComposition(), Я пытаюсь применить НЕСКОЛЬКОAVCompositionTrackодного типаAVMediaTypeVideo в этой единственной композиции. Это потому что я использую 2 разныхAVMediaTypeVideo источники с разнымиCGSizeиpreferredTransforms изAVAssetони пришли.

Итак, единственный способ применить их указанныйpreferredTransforms это предоставить их в 2 разных треках. Но, по какой-то причине, только первый трек будет фактически обеспечивать любое видео, почти как если бы второго трека никогда не было.

Итак, я попробовал

1) используяAVMutableVideoCompositionLayerInstructionи применениеAVVideoComposition вместе сAVAssetExportSession, который работает хорошо, я все еще работаю над преобразованиями, но выполнимо. Но время обработки видео длится более 1 минуты, что просто неприменимо в моей ситуации.

2) Использование нескольких треков, безAVAssetExportSession и вторая дорожка того же типа никогда не появляется. Теперь я мог бы поместить все это на одну дорожку, но тогда все видео будут иметь тот же размер и предпочтительнее трансформироваться, чем первое видео, что мне абсолютно не нужно, так как оно растягивает их со всех сторон.

Итак, мой вопрос, возможно ли

1) Применение инструкций только к треку БЕЗ использованияAVAssetExportSession? // Предпочитаемый способ FAR.

2) Сократить время экспорта? (Я пытался использоватьPresetPassthrough но вы не можете использовать это, если у вас естьexporter.videoComposition где мои инструкции. Это единственное место, где я знаю, что я могу поместить инструкции, но не уверен, что смогу разместить их где-нибудь еще.

Вот часть моего кода (без экспортера, так как мне ничего не нужно никуда экспортировать, просто делайте вещи после того, как AVMutableComposition объединяет элементы.

func merge() {
    if let firstAsset = controller.firstAsset, secondAsset = self.asset {

        let mixComposition = AVMutableComposition()

        let firstTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
                                                                     preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
        do {
            //Don't need now according to not being able to edit first 14seconds.

            if(CMTimeGetSeconds(startTime) == 0) {
                self.startTime = CMTime(seconds: 1/600, preferredTimescale: Int32(600))
            }
            try firstTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, CMTime(seconds: CMTimeGetSeconds(startTime), preferredTimescale: 600)),
                                           ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0],
                                           atTime: kCMTimeZero)
        } catch _ {
            print("Failed to load first track")
        }


        //This secondTrack never appears, doesn't matter what is inside of here, like it is blank space in the video from startTime to endTime (rangeTime of secondTrack)
        let secondTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
                                                                     preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
//            secondTrack.preferredTransform = self.asset.preferredTransform
        do {
            try secondTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, secondAsset.duration),
                                           ofTrack: secondAsset.tracksWithMediaType(AVMediaTypeVideo)[0],
                                           atTime: CMTime(seconds: CMTimeGetSeconds(startTime), preferredTimescale: 600))
        } catch _ {
            print("Failed to load second track")
        }

        //This part appears again, at endTime which is right after the 2nd track is suppose to end.
        do {
            try firstTrack.insertTimeRange(CMTimeRangeMake(CMTime(seconds: CMTimeGetSeconds(endTime), preferredTimescale: 600), firstAsset.duration-endTime),
                                           ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0] ,
                                           atTime: CMTime(seconds: CMTimeGetSeconds(endTime), preferredTimescale: 600))
        } catch _ {
            print("failed")
        }
        if let loadedAudioAsset = controller.audioAsset {
            let audioTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: 0)
            do {
                try audioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, firstAsset.duration),
                                               ofTrack: loadedAudioAsset.tracksWithMediaType(AVMediaTypeAudio)[0] ,
                                               atTime: kCMTimeZero)
            } catch _ {
                print("Failed to load Audio track")
            }
        }
    }
}

редактировать

Apple заявляет, что «Указывает инструкции для композиции видео через NSArray экземпляров классов, реализующих протокол AVVideoCompositionInstruction. Для первой инструкции в массиве timeRange.start должно быть меньше или равно самому раннему времени, в течение которого будет выполняться воспроизведение или другая обработка». попытка (обратите внимание, что обычно это kCMTimeZero.) Для последующих инструкций timeRange.start должен быть равен времени окончания предыдущей инструкции. Время окончания последней инструкции должно быть больше или равно последнему времени, для которого воспроизведение или другое будет предпринята попытка обработки (обратите внимание, что это часто будет продолжительностью ресурса, с которым связан экземпляр AVVideoComposition). "

Это просто говорит о том, что вся композиция должна быть наслоена внутри инструкций, если вы решите использовать ЛЮБЫЕ инструкции (это то, что я понимаю). Почему это? Как бы я просто применил инструкции, чтобы сказать дорожку 2 в этом примере, не применяя изменение дорожки 1 или 3 вообще:

Трек 1 от 0 до 10 с, трек 2 от 10 до 20 с, трек 3 от 20 до 30 с.

Любое объяснение этого, вероятно, ответит на мой вопрос (если это выполнимо).

Ответы на вопрос(2)

Ваш ответ на вопрос