AVAsset видео настроить продолжительность
Приведен список CMSampleBuffers
которые были прочитаны из ресурса, я хочу отрегулировать продолжительность ресурса так, чтобы он составлял половину длины (в два раза больше скорости) оригинала.
В настоящее время моя функция для генерации новых меток времени выглядит следующим образом:
func adjustTimeStampsForBuffers(buffers: [CMSampleBuffer]) -> [CMTime] {
let frameCount = buffers.count
// self.duration is CMTimeGetSeconds(asset.duration)
let increment = Float(self.duration / 2) / Float(frameCount)
return Array(0.stride(to: frameCount, by: 1)).enumerate().map {
let seconds: Float64 = Float64(increment) * Float64($0.index)
return CMTimeMakeWithSeconds(seconds, self.asset.duration.timescale)
}
}
однако это, кажется, не работает, и фактически полученные активы в два раза длиннее, а не вдвое. Кто-нибудь может указать, где я иду не так?
Редактировать:
Спасибо @sschale, вот мой окончательный ответ:
func adjustTimeStampsForBuffers(buffers: [CMSampleBuffer]) -> [CMTime] {
return buffers.map {
let time = CMSampleBufferGetPresentationTimeStamp($0)
return CMTimeMake(time.value, time.timescale * 2)
}
}
Вместо того, чтобы вычислять новые значения, вместо этого корректируется временная метка.
1 ответ
Судя по моему прочтению документации, это выглядит так self.asset.duration.timescale
здесь может быть ключ, так как его изменение повлияет на весь файл (если я понимаю, что вы ссылаетесь на то, что эта временная шкала предназначена для всего файла, или, возможно, вам нужно настроить его в каждом из буферов).
Смотрите здесь для получения дополнительной информации.
Соответствующий раздел:
CMTime представляется как рациональное число с числителем (значение int64_t) и знаменателем (шкала времени int32_t). Концептуально, временная шкала определяет долю секунды, которую занимает каждая единица в числителе. Таким образом, если шкала времени равна 4, каждая единица представляет четверть секунды; если временной масштаб равен 10, каждая единица представляет одну десятую секунды и т. д. В дополнение к простому значению времени, CMTime может представлять нечисловые значения: + бесконечность, -infinity и неопределенный. Использование флага CMTime указывает, было ли время округлено в какой-то момент.
CMTimes содержат номер эпохи, который обычно устанавливается в 0, но может использоваться для различения несвязанных временных шкал: например, его можно увеличивать каждый раз через цикл представления, чтобы отличать время N в цикле 0 от времени N в цикле 1