Мы пытаемся экспортировать видео и поддерживать их FPS. Что случилось:
Пример видеоклипа продолжительностью 1 секунда:
- обычные видеоролики с движением, снятые со скоростью 30 кадров в секунду — экспорт со скоростью 30 кадров в секунду — всего 30 кадров
- обычные видеоролики с движением, снятые со скоростью 60 кадров в секунду — экспорт со скоростью 30 кадров в секунду — всего 30 кадров
- замедленные видеоролики, установленные в галерее камеры для воспроизведения в замедленном режиме, экспортируются со скоростью 30 кадров в секунду, но экспортируются каждый кадр, чтобы охватить более длительный период воспроизведения (например, 1-секундное видео со скоростью 240 кадров в секунду экспортирует 8 секунд видео со скоростью 30 кадров в секунду) — таким образом, 120 или всего 240
- замедленное видео (120 или 240), настроенное на воспроизведение с исходной скоростью (или 1 секунду) — экспорт со скоростью 30 кадров в секунду — всего 30 кадров
Что мы хотим - экспортировать, чтобы камера соответствовала FPS во всех случаях. Мы также сжимаем видео.
Мы безуспешно пытались решить эти и другие проблемы:
Как мне контролировать AVAssetWriter для записи в правильном Частота кадров в секунду
Как установить ожидаемую частоту кадров для AVAssetWriterInput
Я предполагаю, что нам может понадобиться совершенно другой подход - не удалось решить - вот код, используемый для попытки загрузить видео со скоростью 240 кадров в секунду, которое настроено на воспроизведение с исходной скоростью - результат - 30 кадров в секунду 1-секундное видео ( вместо 240 кадров в секунду видео):
PHVideoRequestOptions *options = [PHVideoRequestOptions new];
options.version = PHVideoRequestOptionsVersionCurrent;
[[PHImageManager defaultManager] requestAVAssetForVideo:_phasset options:options resultHandler:^(AVAsset * _Nullable asset, AVAudioMix *
_Nullable audioMix, NSDictionary * _Nullable info)
{
if(([asset isKindOfClass:[AVComposition class]] && ((AVComposition *)asset).tracks.count == 2)) {
SDAVAssetExportSession *encoder = [[SDAVAssetExportSession alloc] initWithAsset:asset];
encoder.outputFileType = AVFileTypeQuickTimeMovie;
encoder.outputURL = url;
encoder.videoSettings = @
{
AVVideoCodecKey: AVVideoCodecH264,
AVVideoWidthKey: [NSNumber numberWithInteger:newWidth],
AVVideoHeightKey: [NSNumber numberWithInteger:newHeight],
AVVideoCompressionPropertiesKey: @
{
// AVVideoAverageBitRateKey: [NSNumber numberWithInteger:bitrate * 1024],
AVVideoAverageBitRateKey: [NSNumber numberWithInteger:bitrate * 1024],
AVVideoProfileLevelKey: AVVideoProfileLevelH264High40,
// AVVideoMaxKeyFrameIntervalKey: [NSNumber numberWithInt:240],
AVVideoExpectedSourceFrameRateKey: [NSNumber numberWithInteger:240]
},
};
encoder.audioSettings = @
{
AVFormatIDKey: @(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey: @1,
AVSampleRateKey: @44100,
AVEncoderBitRateKey: @128000,
};
[encoder exportAsynchronouslyWithCompletionHandler:^{
if (encoder.status == AVAssetExportSessionStatusCompleted) {
NSURL *URL = encoder.outputURL;
// exported video's fps is not 240 fps on here
}
}];
} else {
…
}
}
Любые предложения о том, как исправить текущий код - или как подойти по-другому, который работает?