Я пытаюсь использовать классы 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 или что-то вроде того, что получается.