CMTimeRangeGetUnion
возвращает еще один CMTimeRange
, который является просто (началом) времени и продолжительностью.Так что нет ничего, что могло бы удержать два временных диапазона, необходимые для того, чтобы делать то, что вы ожидаете.Кроме того, AVAssetExportSession не имеет API, который берет список временных диапазонов для экспорта.
Но есть способ сделать это.Идея состоит в том, чтобы создать редактируемую копию актива, удалить временной диапазон, а затем экспортировать редактируемую копию.AVMutableComposition
делает это:
// assuming 'asset', 'endTimeOfRange1' and 'startTimeOfRange2' from the question:
// create empty mutable composition
let composition: AVMutableComposition = AVMutableComposition()
// copy all of original asset into the mutable composition, effectively creating an editable copy
try composition.insertTimeRange( CMTimeRangeMake( kCMTimeZero, asset.duration), of: asset, at: kCMTimeZero)
// now edit as required, e.g. delete a time range
let startTime = CMTime(seconds: endTimeOfRange1, preferredTimescale: 100)
let endTime = CMTime(seconds: startTimeOfRange2, preferredTimescale: 100)
composition.removeTimeRange( CMTimeRangeFromTimeToTime( startTime, endTime))
// since AVMutableComposition is an AVAsset subclass, it can be exported with AVAssetExportSession (or played with an AVPlayer(Item))
if let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetAppleM4A)
{
// configure session and exportAsynchronously as above.
// You don't have to set the timeRange of the exportSession
}
Обратите внимание, что копирование из ресурса в композицию изменяет только некоторые структуры в памяти, определяя, какие сэмплы идут на временной шкале, но фактически не перемещает сэмплы медиа.вокруг.Это не сделано до экспорта;в результате, редактирование (относительно) быстрое, и вам нужно сохранять исходный файл как минимум до завершения экспорта.