Я выполняю некоторые изменения кода в файле проекта AVmulticampip, который я получил с сайта разработчика Apple. Я пытался изменить размер кадра экрана пипса. При записи я изменил Previewlayer.videogravity на .resizeaspectfill. Записанное видео сохраняется в формате резиза. Металлический шейдер используется для объединения видео из двух источников. Я новичок в металле и пробовал много способов решить проблему.
Ниже приведен код для металлического шейдера. Он рассчитывает положение и размер кадра пипа и вставляет видео с передней и задней камеры.
#include <metal_stdlib>
using namespace metal;
struct MixerParameters
{
float2 pipPosition;
float2 pipSize;
};
constant sampler kBilinearSampler(filter::linear, coord::pixel, address::clamp_to_edge);
// Compute kernel
kernel void reporterMixer(texture2d<half, access::read> fullScreenInput [[ texture(0) ]],
texture2d<half, access::sample> pipInput [[ texture(1) ]],
texture2d<half, access::write> outputTexture [[ texture(2) ]],
const device MixerParameters& mixerParameters [[ buffer(0) ]],
uint2 gid [[thread_position_in_grid]])
{
uint2 pipPosition = uint2(mixerParameters.pipPosition);
uint2 pipSize = uint2(mixerParameters.pipSize);
half4 output;
// Check if the output pixel should be from full screen or PIP
if ( (gid.x >= pipPosition.x) && (gid.y >= pipPosition.y) &&
(gid.x < (pipPosition.x + pipSize.x)) && (gid.y < (pipPosition.y + pipSize.y)) )
{
// Position and scale the PIP window
float2 pipSamplingCoord = float2(gid - pipPosition) * float2(pipInput.get_width(), pipInput.get_height()) / float2(pipSize);
output = pipInput.sample(kBilinearSampler, pipSamplingCoord + 0.5);
}
else
{
output = fullScreenInput.read(gid);
}
outputTexture.write(output, gid);
}
Есть ли способ получить это масштабированное видео? Есть ли другой способ объединить два видео.