QTKit 以慢动作播放电影

Posted

技术标签:

【中文标题】QTKit 以慢动作播放电影【英文标题】:QTKit Play Movie in Slow Motion 【发布时间】:2011-06-14 10:04:01 【问题描述】:

我正在尝试以慢动作播放电影并将其附加到现有电影。这是我到目前为止所做的:

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

这会以慢动作正确播放视频,但不会以慢动作保存第二个视频的音频。 IE。第二个视频是慢动作,但它的音频不是!。

更新 2:

需要明确的是,如果我尝试立即从我的可可应用程序在 quicktime 播放器中播放 originalVideo,则第二个视频的音频会以慢动作播放。只是音频不同步的保存文件。

我发布完整代码以防万一:

- (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】:

好的,所以要以慢动作添加第二部电影,需要执行以下操作:

- (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,您可能会遇到各种错误,因此请使用[originalMovie writeToFile] 将其保存在新位置。

【讨论】:

以上是关于QTKit 以慢动作播放电影的主要内容,如果未能解决你的问题,请参考以下文章

如何从电影创建动画 .gif?

查找正在播放“动作”类型的演员姓名的 SQL 查询

如何停止播放电影?

为什么豆瓣高分电影里几乎全是剧情或文艺片

MPMoviePlayerController 随机不播放电影

点击 CollectionView Cell 按钮以播放来自特定阵列的声音并从特定阵列复制电影