Мы пытаемся экспортировать видео и поддерживать их FPS. Что происходит:
Для 1-секундного примера видеоклипа:
- обычных видеороликов, снятых со скоростью 30 кадров в секунду - экспорт со скоростью 30 кадров в секунду - 30 кадров
всего
- обычные видеоролики, снятые со скоростью 60 кадров в секунду - экспорт со скоростью 30 кадров в секунду -
30 кадров всего
- замедленное видео, установленное в кадре камеры для воспроизведения в замедленном режиме, экспорт
со скоростью 30 кадров в секунду - но экспортируйте каждый кадр, чтобы охватить более длительный период воспроизведения
(например, 1 секунда видео с частотой 240 кадров в секунду экспортирует 8 секунд видео с 30
fps) - итого 120 или 240 всего
- замедленное видео (120 или 240) для воспроизведения на родной скорости (или 1
второе) - экспорт при 30 кадрах в секунду - всего 30 кадров
То, что мы хотим - экспортировать, чтобы соответствовать кадрам камеры FPS во всех случаях. Мы также сжимаем видео.
Мы попытались решить проблему, просмотрев эти и другие:
Как мне управлять AVAssetWriter для записи с правильным FPS
Как установить ожидаемую частоту кадров в AVAssetWriterInput
Я предполагаю, что нам может понадобиться совершенно другой подход - не удалось решить - вот код, используемый для попытки загрузить видео с частотой 240 кадров в секунду, настроенное для воспроизведения его с собственной скоростью - в результате получается 30 кадров в секунду 1 второе видео (вместо 240 кадров в секунду на 1 секунду):
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 {
…
}
}
Любые предложения о том, как исправить текущий код - или как подойти по-другому, который работает?