iphone export - как сохранить FPS на видео> 30 FPS - PullRequest
0 голосов
/ 15 ноября 2018

Мы пытаемся экспортировать видео и поддерживать их 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 {
        …
    }
}

Любые предложения о том, как исправить текущий код - или как подойти по-другому, который работает?

...