【问题标题】:How to refresh currrent frame of GPUImageMovie?如何刷新 GPUImageMovie 的当前帧?
【发布时间】:2018-09-25 23:15:19
【问题描述】:

我使用 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。我尝试播放电影播放器​​并再次暂停,但有时它不起作用。我该如何解决这个问题?

【问题讨论】:

    标签: ios image-processing gpuimage


    【解决方案1】:

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

    在你的播放器暂停时,如果你寻找 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)")
        }
    

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 2015-12-01
      • 2013-05-02
      • 2013-07-21
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多