Я пытаюсь воспроизвести фильм в замедленном режиме и прикрепить его к существующему фильму. Вот что я сделал до сих пор:
QTMovie *originalMovie = ...;
QTMovie *slowMotionMovie = ...;
[originalMovie insertSegmentOfMovie:slowMotionMovie timeRange:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) atTime:[originalMovie duration]];
Это правильно добавляет второй фильм к первому, но, конечно, не замедляет его. Я знаю, что есть другой метод insertSegmentOfMovie:fromRange:scaledToRange:
, но я не знаю, как установить временные диапазоны там.
Любая помощь будет оценена
ОБНОВЛЕНИЕ: Я могу использовать следующий код для добавления замедленного движения:
[slowMotionMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];
QTTime newDuration = QTMakeTime([slowMotionMovie duration].timeValue * 2, [slowMotionMovie duration].timeScale);
[slowMotionMovie scaleSegment:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) newDuration:newDuration];
Это правильно воспроизводит видео в замедленном режиме, но не сохраняет аудио второго видео в замедленном режиме. И.Е. второе видео находится в замедленном режиме, но его аудио нет! *
ОБНОВЛЕНИЕ 2:
Для ясности, если я попытаюсь воспроизвести оригинальное видео в быстродействующем проигрывателе прямо из приложения какао, звук второго видео будет воспроизводиться в замедленном режиме. Это только сохраненный файл, звук которого не синхронизирован.
Я выкладываю полный код на случай, если это поможет:
- (void)captureOutput:(QTCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL forConnections:(NSArray *)connections dueToError:(NSError *)error
{
QTMovie *originalMovie = [QTMovie movieWithURL:outputFileURL error:nil];
[originalMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];
QTMovie *slowMotionMovie = [QTMovie movieWithURL:outputFileURL error:nil];
[slowMotionMovie setAttribute:[NSNumber numberWithBool:YES] forKey:QTMovieEditableAttribute];
// Scale the second video
QTTime newDuration = QTMakeTime([slowMotionMovie duration].timeValue * 2, [slowMotionMovie duration].timeScale);
[slowMotionMovie scaleSegment:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) newDuration:newDuration];
// Attach Slow motion video
[originalMovie insertSegmentOfMovie:slowMotionMovie timeRange:QTMakeTimeRange(QTZeroTime, [slowMotionMovie duration]) atTime:[originalMovie duration]];
// If I play originalMovie, both video and audio of slowMotionMovie are correct (i.e. in slow motion)
[originalMovie updateMovieFile];
// However, the video that's being saved here has its audio out of sync (i.e. not in slow motion)
}
Обновление 3:
Если я открываю последний файл с помощью программы, отличной от quicktime, например, vlc, воспроизведение видео прекращается в конце первого видео (где должно начинаться движение), но звук продолжает воспроизводиться до конца.
Обновление 4:
Если я использую [originalMovie writeToFile:withAttributes]
и указываю новое местоположение, все работает как положено. Только когда я пытаюсь перезаписать файл, я сталкиваюсь с любыми проблемами.