QTKit Воспроизведение фильма в замедленной съемке

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

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:

Чтобы было ясно, если я попытаюсь воспроизвести originalVideo в проигрывателе quicktime сразу из моего приложения какао, звук второго видео будет воспроизводиться в замедленном темпе. Это только сохраненный файл, звук которого не синхронизирован.

Я отправляю полный код на всякий случай, если это поможет:

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


person Oscar Del Ben    schedule 14.06.2011    source источник


Ответы (1)


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

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

person Oscar Del Ben    schedule 15.06.2011