Новое редактирование ниже
Я уже упоминал
AVMutableComposition - только первый трек (Swift)
но он не дает ответа на то, что я ищу.
У меня есть AVMutableComposition()
. Я пытаюсь применить MULTIPLE AVCompositionTrack
одного типа AVMediaTypeVideo
в этой единственной композиции. Это связано с тем, что я использую 2 разных источника AVMediaTypeVideo
с разными CGSize
и preferredTransforms
из AVAsset
, из которых они берутся.
Таким образом, единственный способ применить свой указанный preferredTransforms
- предоставить их в 2 разных дорожках. Но по какой-то причине только первый трек фактически предоставит любое видео, почти так же, как если бы второй трек никогда не был там.
Итак, я пробовал
1), используя AVMutableVideoCompositionLayerInstruction
и применяя AVVideoComposition
вместе с AVAssetExportSession
, который работает нормально, я все еще работаю над преобразованиями, но умею. Но время обработки видео WELL OVER 1 минута, что просто неприменимо в моей ситуации.
2) Использование нескольких треков без AVAssetExportSession
и 2-го трека того же типа никогда не появляется. Теперь я могу поместить все это на один трек, но все видео будут иметь тот же размер и предпочтительныйTransform, что и первое видео, которое я абсолютно не хочу, поскольку он растягивает их со всех сторон.
Итак, мой вопрос: возможно ли это
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")
}
}
}
}
Edit
Apple заявляет, что "Указывает инструкции для композиции видео через NSArray экземпляров классов, реализующих протокол AVVideoCompositionInstruction. Для первой команды в массиве timeRange.start должен быть меньше или равен самому раннему времени, для которого будет предпринято воспроизведение или другая обработка (обратите внимание, что это обычно kCMTimeZero). Для последующих инструкций timeRange.start должен быть равен времени окончания предыдущей команды. Время окончания последняя команда должна быть больше или равна последнему времени, за которое будет производиться воспроизведение или другая обработка (обратите внимание, что это часто будет продолжительность актива, с которым связан экземпляр AVVideoComposition).
Это означает, что вся композиция должна быть наложена внутри команд, если вы решите использовать ЛЮБЫЕ инструкции (это то, что я понимаю). Почему это? Как бы я просто применил инструкции, чтобы сказать дорожку 2 в этом примере, не применяя при этом изменение трека 1 или 3:
Трек 1 от 0 до 10 секунд, Трек 2 от 10 до 20 секунд, Трек 3 от 20 до 30 секунд.
Любое объяснение этого, вероятно, ответит на мой вопрос (если это выполнимо).