Я использую отличную библиотеку Брэда Ларсона GPUImage для своего приложения. В настоящее время я столкнулся с проблемой. Мое приложение записывает 10-секундные видеоролики, после чего разрешает применение filter. При применении filters в GPUImageMovie я не могу приостановить воспроизведение и применить новый filter, чтобы видео воспроизводилось непрерывно, не начиная с самого начала.

Я видел открытую проблему с github здесь. Если кто-то столкнулся с подобной проблемой и нашел решение, опубликуйте свои ответы. Заранее спасибо.

4
QUserS 22 Май 2014 в 10:58

2 ответа

Лучший ответ

И, наконец, я исправил это после слишком многих поисков и попыток. Нам нужно запустить GPUImageMovie с помощью AVPlayerItem вместо URL. Я получил эту ценную подсказку здесь.

Я публикую свой код, который сейчас использую в своем приложении, и он работает должным образом. Но в 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];
}
9
Community 23 Май 2017 в 15:25

В моем случае использование AVPlayerItem было невозможно (я использую композиции).

Вместо этого я сделал такой код:

class PausableGPUImageMovie: GPUImageMovie {
    var isPaused = false

    override func readNextVideoFrame(from readerVideoTrackOutput: AVAssetReaderOutput!) -> Bool {
        while isPaused {
            usleep(100_000)
        }
        return super.readNextVideoFrame(from: readerVideoTrackOutput)
    }
}

Очень дамп, но не стесняйтесь его улучшать.

0
Antzi 29 Июн 2018 в 09:34