QTKit Воспроизведение фильма в замедленном темпе - PullRequest
2 голосов
/ 14 июня 2011

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

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] и указываю новое местоположение, все работает как положено. Только когда я пытаюсь перезаписать файл, я сталкиваюсь с любыми проблемами.

1 Ответ

0 голосов
/ 15 июня 2011

Хорошо, поэтому, чтобы добавить второй фильм в замедленном режиме, нужно сделать следующее:

- (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]];

}

Но тогда, если вы попытаетесь перезаписать оригинал фильма, вы можете получить все виды ошибок, поэтому вместоэто в новом месте с [originalMovie writeToFile].

...