Частота кадров AVAssetWriter немного снижена

Я пытаюсь использовать классы OSX AVAsset для чтения видеокадров из файла фильма, настройки цвета, а затем записи их в новый файл фильма. У меня все работает, за исключением того, что по какой-то странной причине я читаю видео, которое воспроизводится со скоростью 29,97 кадров в секунду (по словам инспектора в Final Cut Pro X), выходное видео указано как 30 кадров. в секунду даже. Это небольшое несоответствие, среди прочих проблем, не позволяет мне поменять местами два видеофайла в проекте Final Cut.

Я использую точную информацию о времени из декодированных/входных кадров при написании/кодировании. Вот соответствующий код ниже.

При чтении/декодировании кадра:

CMSampleBufferRef videoSampleBuffer = [assetReaderVideoOutput copyNextSampleBuffer];  
if (videoSampleBuffer == NULL)  
  return false;  

CMSampleTimingInfo myTiming;  
CMSampleBufferGetSampleTimingInfo(videoSampleBuffer, 0, &myTiming);  
frameInfo->frameTimeValue = myTiming.presentationTimeStamp.value;  
frameInfo->frameTimeScale = myTiming.presentationTimeStamp.timescale;

При записи/кодировании модифицированного кадра:

CMTime myTime = CMTimeMake(frameInfo->frameTimeValue, frameInfo->frameTimeScale);  
[pixelBufferAdapter appendPixelBuffer:pixelsBuffer withPresentationTime:myTime]; 

Идеи? Значения временной шкалы, похоже, указывают на то, что видео должно кодироваться со скоростью 29,97 кадра в секунду (у него есть значения frameTimeValue 1001 и 2002 и т. д. с frameTimeScale 30000). Даже если я вручную увеличу значение frameTimeValue примерно на 1030 для каждого кадра, а не на 1001, оно все равно привязывает видео к 30 кадрам в секунду. Как только я выкручиваю его до 1050, я начинаю получать точную частоту кадров около 28,75 или что-то вроде того, что получается.


person Thomas    schedule 13.08.2015    source источник


Ответы (1)


Обнаружена проблема - вам нужно вручную установить шкалу времени AVAssetWriterInput, прежде чем добавлять какие-либо кадры. В противном случае предполагается некоторая временная шкала, которая может быть несовместима с временной шкалой добавляемых кадров, вызывая ошибки округления и создавая неправильную частоту кадров.

assetWriterInputVideo.mediaTimeScale = 30000;
person Thomas    schedule 14.08.2015
comment
Это устранило заикание, которое возникало при экспорте видео со скоростью 60 кадров в секунду. Я бы порекомендовал вам также установить переменную AVAssetWriter movieTimeScale на то же значение. Документация: In order to avoid inconsistencies between the track's media time scale and the result's media time scale (see AVAssetWriter property movieTimeScale ) both should be set to equal or compatible values. Если вы начинаете с AVAsset, вы можете получить naturalTimeScale из AVAssetTrack. Благодарю вас! - person Josh Bernfeld; 28.03.2018