AVAsset и композиция
Исследуйте и объединяйте медиадорожки.
«AVAsset и композиция» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.
AVAsset представляет медиа
AVAsset описывает фрагмент медиа, зависящего от времени: его дорожки, длительность и метаданные, не связывая его с воспроизведением. Это основа для редактирования.
import AVFoundation
let asset = AVURLAsset(url: fileURL)Асинхронная загрузка свойств
Свойства медиаресурса загружаются по требованию. Используйте асинхронный API load(_:), чтобы получить длительность или дорожки, не блокируя выполнение.
let duration = try await asset.load(.duration)
let tracks = try await asset.load(.tracks)Дорожки
Медиаресурс содержит дорожки AVAssetTrack, каждая из которых представляет один тип медиа: видео, звук или субтитры. При редактировании Вы просматриваете эти дорожки и повторно используете их.
let videoTracks = try await asset.loadTracks(withMediaType: .video)
let audioTracks = try await asset.loadTracks(withMediaType: .audio)AVMutableComposition
AVMutableComposition — это редактируемый медиаресурс, который Вы создаёте, вставляя диапазоны времени из других медиаресурсов. Это основа обрезки и объединения клипов.
let composition = AVMutableComposition()Добавление дорожек composition
Создайте изменяемую дорожку для каждого типа медиа, указав её тип и идентификатор дорожки.
let videoTrack = composition.addMutableTrack(
withMediaType: .video,
preferredTrackID: kCMPersistentTrackID_Invalid)Вставка диапазонов времени
Скопируйте сегмент исходной дорожки в дорожку composition с помощью insertTimeRange, выбрав место его размещения на временной шкале.
let range = CMTimeRange(start: .zero, duration: try await asset.load(.duration))
try videoTrack?.insertTimeRange(range, of: sourceTrack, at: .zero)Обрезка клипа
Чтобы обрезать клип, вставьте только часть исходной дорожки, указав поддиапазон — начальную позицию и меньшую длительность.
let clip = CMTimeRange(
start: CMTime(seconds: 5, preferredTimescale: 600),
duration: CMTime(seconds: 10, preferredTimescale: 600))
try videoTrack?.insertTimeRange(clip, of: sourceTrack, at: .zero)Объединение нескольких клипов
Добавляйте клипы один за другим, вставляя каждый в текущую длительность composition и создавая единую непрерывную временную шкалу.
var cursor = CMTime.zero
for src in sourceTracks {
let r = CMTimeRange(start: .zero, duration: src.timeRange.duration)
try videoTrack?.insertTimeRange(r, of: src, at: cursor)
cursor = cursor + r.duration
}Видео composition для эффектов
Для преобразований, наложения слоёв или переходов объедините composition с AVMutableVideoComposition, задающим инструкции для отдельных диапазонов времени.
let videoComposition = AVMutableVideoComposition()
videoComposition.frameDuration = CMTime(value: 1, timescale: 30)Экспорт результата
Отрендерьте composition в файл с помощью AVAssetExportSession, выбрав предустановку и URL выходного файла.
let export = AVAssetExportSession(
asset: composition, presetName: AVAssetExportPresetHighestQuality)
export?.outputURL = outputURL
export?.outputFileType = .mp4
await export?.export()Предварительный просмотр перед экспортом
Поскольку composition сам является AVAsset, Вы можете обернуть его в AVPlayerItem и просмотреть результат редактирования перед экспортом.
let previewItem = AVPlayerItem(asset: composition)
let player = AVPlayer(playerItem: previewItem)Быстрая проверка: composition
Проверьте, насколько хорошо Вы понимаете AVAsset и composition.
Итоги: AVAsset и composition
AVAsset описывает медиа (дорожки, длительность и метаданные), а его свойства загружаются асинхронно. AVMutableComposition создаёт редактируемые временные шкалы, вставляя диапазоны времени из исходных дорожек, что позволяет обрезать и объединять клипы.
Добавьте AVMutableVideoComposition для эффектов, выполните предварительный просмотр, обернув composition в AVPlayerItem, и отрендерьте результат с помощью AVAssetExportSession.
Часто задаваемые вопросы
Урок «AVAsset и композиция» бесплатный?
Да — полный текст урока «AVAsset и композиция» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.
Чему я научусь в уроке «AVAsset и композиция»?
Исследуйте и объединяйте медиадорожки. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Swift Academy?
Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «AVAsset и композиция»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Swift Academy?
Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Воспроизведение медиа с AVPlayer
- Запись аудио
- AVAsset и композиция
- Встраивание проигрывателей в SwiftUI