GPUImageMovie не уважая imageOrientation

Я использую GPUImageMovie, который воспроизводит файл фильма, этот файл был записан на устройстве iOS.

Однако, когда GPUImageMovie воспроизводит его, он имеет неправильную ориентацию, поэтому видео не поворачивается для правильного отображения.

Как мне заставить его уважать его ориентацию? Я попытался изменить код OpenGL без удачи.

1 ответ

Решение

У меня была такая же проблема при воспроизведении видео, записанного на устройстве iOS с использованием GPUImageMovie. Я решил это, используя следующие функции:

Позвони setRotationForFilter: метод, передав вам фильтр. orientationForTrack: вернет вашу текущую ориентацию видео.

- (void)setRotationForFilter:(GPUImageOutput<GPUImageInput> *)filterRef {
    UIInterfaceOrientation orientation = [self orientationForTrack:self.playerItem.asset];
    if (orientation == UIInterfaceOrientationPortrait) {
        [filterRef setInputRotation:kGPUImageRotateRight atIndex:0];
    } else if (orientation == UIInterfaceOrientationLandscapeRight) {
        [filterRef setInputRotation:kGPUImageRotate180 atIndex:0];
    } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
        [filterRef setInputRotation:kGPUImageRotateLeft atIndex:0];
    }
}

- (UIInterfaceOrientation)orientationForTrack:(AVAsset *)asset
{
    AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    CGSize size = [videoTrack naturalSize];
    CGAffineTransform txf = [videoTrack preferredTransform];

    if (size.width == txf.tx && size.height == txf.ty)
        return UIInterfaceOrientationLandscapeRight;
    else if (txf.tx == 0 && txf.ty == 0)
        return UIInterfaceOrientationLandscapeLeft;
    else if (txf.tx == 0 && txf.ty == size.width)
        return UIInterfaceOrientationPortraitUpsideDown;
    else
        return UIInterfaceOrientationPortrait;
}

Надеюсь, это решит вашу проблему.

Добавить в @Ameet Dhas: одно место для установки вращения - это место перед вызовом следующего фильтра.

[currentTarget setInputRotation:outPutRotation atIndex:targetTextureIndex];
[currentTarget newFrameReadyAtTime:currentSampleTime atIndex:targetTextureIndex];
Другие вопросы по тегам