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

Другие вопросы по тегам