如何刷新GPUImageMovie的currrent框架?

时间:2018-04-16 09:08:14

标签: ios image-processing gpuimage

我使用AVPlayer和GPUImageMovie控制电影文件的播放,同时应用过滤器如下:

NSURL *mediaURL = ...
AVPlayer *mainPlayer = [[AVPlayer alloc] init];
AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:mediaUrl];
[mainPlayer replaceCurrentItemWithPlayerItem:playerItem];

GPUImageMovie *currentMovieFile = [[GPUImageMovie alloc] initWithPlayerItem:playerItem];
GPUImageFilter *filter = <a filter>;
GPUImageView *videoView = [[GPUImageView alloc] initWith...];
[currentMovieFile addTarget:filter];
[filter addTarget:videoView];
[currentMovieFile startProcessing];
[mainPlayer play];

一切正常,直到我暂停播放并更改过滤器:

[mainPlayer pause];
[filter removeTarget:videoView];
[currentMovieFile removeTarget:filter];
filter = <new filter>;
[currentMovieFile addTarget:filter];
[filter addTarget:videoView];

我需要在播放暂停时使用新过滤器更新videoView。我试图播放电影播放器​​并再次暂停,但有时它确实有效。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我找到了一个棘手的解决方案。

在播放器暂停时,如果您寻求的playerItem最小为CMTime(例如CMTime(value:1,timescale:1000)),则GPUImageFilters再次呈现。 您不必担心会进行预览更新,因为这确实很短。

请参阅我的代码。

    let player: AVPlayer
    let time: CMTime = player.currentTime()

    let diffTime = CMTime(value: 1, timescale: time.timescale)
    var seekTime = time + diffTime

    if let endTime = player.duration {
        if seekTime > endTime {
            seekTime = endTime - diffTime
        }
    }

    player.seek(to: seekTime, toleranceBefore: .zero, toleranceAfter: .zero) { success in
        print("seek success \(checkTime), \(success)")
    }