【问题标题】:GPUImageMovie pause while applying filter应用滤镜时 GPUImageMovie 暂停
【发布时间】:2014-05-22 06:58:32
【问题描述】:

我正在为我的应用程序使用 Brad Larson 的优秀库 GPUImage。目前我遇到了一个问题。我的应用程序捕获 10 秒的视频,然后允许 filter 申请。在GPUImageMovie 中应用filters 时,我无法暂停播放并应用新的filter,这样视频就不会从头开始连续播放。

我看到了一个开放的 github 问题 here。如果有人遇到类似问题并找到解决方案,请发布您的答案。提前致谢。

【问题讨论】:

    标签: ios video gpuimage


    【解决方案1】:

    经过多次搜索并尝试后,我终于解决了这个问题。我们需要使用 AVPlayerItem 而不是 URL 来启动 GPUImageMovie。我从here 那里得到了这条有价值的线索。

    我正在发布我目前在我的应用程序中使用的代码,它按预期工作。但是 iPod 6.1 中存在性能问题,我正在努力改进。

    设置 GPUImageMovie 的初始方法,

    - (void)setupVideo
    {
        playerItem = [[AVPlayerItem alloc]initWithURL:self.recordSession.outputUrl];
        player = [AVPlayer playerWithPlayerItem:playerItem];
    
        movieFile = [[GPUImageMovie alloc] initWithPlayerItem:playerItem];
    
        movieFile.runBenchmark = YES;
        movieFile.playAtActualSpeed = YES;
        [self.view sendSubviewToBack:self.videoView];
    
        [movieFile addTarget:filter];
        [filter addTarget:self.videoView];
    
        [movieFile startProcessing];
        movieRunning = YES;
    
        dispatch_async(dispatch_get_main_queue(), ^{
            self.playButton.hidden = YES;
        });
    
        player.rate = 1.0;
    }
    

    当用户点击过滤器按钮时调用此方法。

    - (void)filterClicked:(UIButton *)button
    {
        // Set paused time. If player reaches end of the video, set pausedTime to 0.
        if (CMTIME_COMPARE_INLINE(pausedTime, !=,  player.currentItem.asset.duration)) {
            pausedTime = player.currentTime;
        } else {
            pausedTime = CMTimeMake(0, 600.0);
        }
        [self.videoView setBackgroundColor:[UIColor clearColor]];
    
        [movieFile cancelProcessing];
    
        switch (button.tag)
        {
        case 0:
            filter = [[GPUImageFilter alloc] init];
            break;
        case 1:
            filter = [[GPUImageColorInvertFilter alloc] init];
            break;
        case 2:
            filter = [[GPUImageEmbossFilter alloc] init];
            break;
        case 3:
            filter = [[GPUImageGrayscaleFilter alloc] init];
            break;
        default:
            filter = [[GPUImageFilter alloc] init];
            break;
        }
    
        [self filterVideo];
    
    }
    

    过滤器生成后,视频播放恢复在此方法中处理。

    - (void)filterVideo {
    
        // AVPlayerItem is initialized with required url
    
        playerItem = [[AVPlayerItem alloc]initWithURL:self.outputUrl]; 
        [player replaceCurrentItemWithPlayerItem:playerItem];
    
        //GPUImageMovie is initialized with AVPlayerItem
    
        movieFile = [[GPUImageMovie alloc] initWithPlayerItem:playerItem];
    
        movieFile.runBenchmark = YES;
        movieFile.playAtActualSpeed = YES;
    
        // Adding targets for movieFile and filter
    
        [movieFile addTarget:filter];
        [filter addTarget:self.videoView]; // self.videoView is my GPUImageView
    
        [movieFile startProcessing];
        movieRunning = YES;
    
        dispatch_async(dispatch_get_main_queue(), ^{
            self.playButton.hidden = YES;
        });
    
        // Player rate is set to 0 means player is paused
    
        [player setRate:0.0];
    
        // Seeking to the point where video was paused
    
         if (CMTIME_COMPARE_INLINE(pausedTime, !=, player.currentItem.asset.duration)) {
            [player seekToTime:pausedTime];
        }
        [player play];
    }
    

    【讨论】:

      【解决方案2】:

      就我而言,使用AVPlayerItem 是不可行的(我使用组合)。

      相反,我编写了以下代码:

      class PausableGPUImageMovie: GPUImageMovie {
          var isPaused = false
      
          override func readNextVideoFrame(from readerVideoTrackOutput: AVAssetReaderOutput!) -> Bool {
              while isPaused {
                  usleep(100_000)
              }
              return super.readNextVideoFrame(from: readerVideoTrackOutput)
          }
      }
      

      非常垃圾,但请随时改进。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 2021-07-24
        • 2018-11-14
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多