Код: Выделить всё
AVSampleBufferDisplayLayer
Проблема, с которой я столкнулся, заключается в том, что UIView масштабируется до правильно вписывается в экран, но добавленный к нему CALayer не масштабируется в соответствии с видом, и поэтому большая часть воспроизводимого видео выходит за пределы представления и в конечном итоге обрезается iPhone экран.
Моя цель — добиться того, чтобы масштаб CALayer заполнял любые границы представления, в котором он находится, чтобы я мог сжимать или увеличивать представление и воспроизводимое видео. в CALayer масштабируется соответствующим образом.
Я создаю представление со следующим:
Код: Выделить всё
struct VideoPlayer: UIViewRepresentable {
var player: AVSampleBufferDisplayLayer
var view: some UIView {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 1920, height: 1080))
player.frame = view.bounds
player.bounds = view.bounds
player.videoGravity = .resizeAspect
view.layer.addSublayer(player)
return view
}
func makeUIView(context: Context) -> UIView {
return view
}
func updateUIView(_ uiView: UIViewType, context: Context) {}
}
Код: Выделить всё
struct VideoView: View {
let timer = Timer.publish(every: 0.015, on: .main, in: .common).autoconnect()
var body: some View {
let sampleLayer = AVSampleBufferDisplayLayer()
let player = VideoPlayer(player: sampleLayer)
return player.onReceive(timer) { _ in
let buffer = retrieve_video_buffers()
if buffer != nil {
player.player.enqueue(buffer!)
}
}
}
}
Код: Выделить всё
struct ContentView: View {
var body: some View {
VStack {
VideoView()
.aspectRatio(CGSize(width: 1920, height: 1080),
contentMode: ContentMode.fit)
}
}
}
Симулятор iPhone в портретном режиме показывает, что CALayer выходит за пределы просмотра
Симулятор iPhone в ландшафтном режиме показывает, что CALayer выходит за пределы просмотра
Любая помощь приветствуется! Я чувствую себя застрявшим, неспособным понять это.
Подробнее здесь: https://stackoverflow.com/questions/684 ... rapped-for