Отразить видео по горизонтали по оси X в объективе C - PullRequest
0 голосов
/ 02 января 2019

У меня два одновременно воспроизводят два видео на просмотре. Оба видео будут одинаковыми.

Теперь меня беспокоит то, что видео справа должно быть перевернуто горизонтально вдоль оси x, а затем сохранено в библиотеке фотографий. Я много пробовал поискать в Google и обнаружил, что CGAFFineRotateTransform может помочь, но я не могу использовать это в мой код. Пожалуйста, помогите мне перевернуть видео по горизонтали вправо, сохраняя при этом масштаб и двигаясь так же.

Любая помощь или руководство в этом направлении было бы заметно. Заранее спасибо!

Проверьте разницу между видео слева и справа, видео слева завершено, но видео справа показывает только половину видео

1 Ответ

0 голосов
/ 02 января 2019

Чтобы просто перевернуть (отразить) видео по горизонтали, используйте отрицательное значение x для масштабирования:

CGAffineTransform scale = CGAffineTransformMakeScale( -1.0, 1.0);

Редактировать : Относительно вашего более общего вопроса о том, как позиционировать дорожки: Для каждой задействованной видео дорожки:

  • построить ограничивающий прямоугольник на основе исходного размера дорожки - это исходный прямоугольник
  • спросите себя, где трек должен заканчиваться, с точки зрения происхождения и размера в полученном видео - это даст вам пункт назначения

Затем вы можете получить соответствующее аффинное преобразование с помощью функции:

CGAffineTransform NHB_CGAffineTransformMakeRectToRect( CGRect srcRect, CGRect dstRect)
{
    CGAffineTransform t = CGAffineTransformIdentity;
    t = CGAffineTransformTranslate( t, dstRect.origin.x - fmin( 0., dstRect.size.width), dstRect.origin.y - fmin( 0., dstRect.size.height));
    t = CGAffineTransformScale( t, dstRect.size.width / srcRect.size.width, dstRect.size.height / srcRect.size.height);
    return t;
}

Для зеркального отображения укажите отрицательный размер для соответствующей оси (часть - fmin(,) компенсирует смещение).

Учитывая видео дорожку и предполагая, например, что дорожка должна быть зеркально отражена к правой половине видео 640x480, вы можете получить соответствующее преобразование с помощью:

CGSize srcSize = videoTrack.naturalSize;
CGRect srcRect = CGRectMake( 0, 0, srcSize.width, srcSize.height);
CGRect dstRect = CGRectMake( 320, 0, -320, 480);
CGAffineTransform t = NHB_CGAffineTransformMakeRectToRect(srcRect, dstRect);

Конечно, это может растянуть видео дорожку; чтобы сохранить соотношение сторон, вам нужно будет учитывать исходный размер при расчете целевого прямоугольника.

Некоторые замечания:

  • обратите внимание, что в NHB_CGAffineTransformMakeRectToRect я сознательно решил начать с матрицы тождеств, а затем добавить необходимые преобразования по одному. Таким образом, можно построить гораздо более сложные преобразования, включая вращение. Как я уже сказал, попытайтесь понять аффинные преобразования, они действительно мощные
  • AVAssetTrack s naturalSize иногда возвращает неверные результаты для некоторых видео со сложными определениями SAR / PAR. Чтобы сделать это пуленепробиваемым, вам нужно будет определить размер по размерам в соответствующих описаниях форматов, но это совершенно новая тема ...
...