Я пишу игру iOS, и это экраны Splash. У меня есть видео в ландшафтной ориентации, которое я хочу использовать в качестве анимированного фона для Uiview с некоторыми другими видами, композированными на вершине. Мне не нужно никакого контроля пользовательского интерфейса по воспроизведению видео, это просто анимированная текстура. < /P>
Мне всегда нужно видео, чтобы заполнить полную высоту экрана, изменяющийся в исходном соотношении сторон и ** обрезанное на правом **, если это необходимо. < /P>
Изображение показывает точный эффект, который я после. src = "https://i.sstatic.net/ykoatdu0.png"/>
AVPlayer и avplayerlayer , кажется, делают жесткие предположения, что если я настаиваю на том, чтобы не хотеть полного кадры видео, я должен быть заинтересован только в центральной части видео. Я что -то упускаю? < /P>
Если нет простого решения, что я могу сделать? Читая документы. Похоже, я мог бы получить доступ к сырым пикселям, используя AvPlayeriTemVideOoutput (??), а затем внедрить пиксели в Calayer или Caimage каким -то образом, но Google не помогает с этим, и, похоже, нет никакого соответствующего кода ADC. AV, кажется, в основном винтажный объектив-C. Таким образом, я был сведен к кодирующемуся Vibe, и это было так же хорошо, как и вы ожидаете, чтобы получить небольшой документированный уголок iOS! PrettyPrint-Override ">import SwiftUI
import AVFoundation
import UIKit
class VideoLayerView: UIView {
var displayLayer: CALayer!
var player: AVPlayer!
var playerLayer: AVPlayerLayer!
var output: AVPlayerItemVideoOutput!
override init(frame: CGRect) {
super.init(frame: frame)
self.displayLayer = CALayer()
self.layer.addSublayer(displayLayer)
setupPlayer()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.displayLayer = CALayer()
self.layer.addSublayer(displayLayer)
setupPlayer()
}
override func layoutSubviews() {
super.layoutSubviews()
// Ensure the CALayer is the size of the parent view
displayLayer.frame = bounds
playerLayer.frame = bounds
}
func setupPlayer() {
guard let url = Bundle.main.url(forResource: "example", withExtension: "MP4") else {
print("Video file not found")
return
}
let playerItem = AVPlayerItem(url: url)
player = AVPlayer(playerItem: playerItem)
// Create video output
output = AVPlayerItemVideoOutput()
playerItem.add(output)
// Set up player layer
playerLayer = AVPlayerLayer(player: player)
layer.addSublayer(playerLayer)
// Hide the AVPlayerLayer, so only the processed video frame is shown
playerLayer.isHidden = true
// Start playing
player.play()
// Set a timer to capture video frames and update the layer
Timer.scheduledTimer(timeInterval: 1/30, target: self, selector: #selector(updateFrame), userInfo: nil, repeats: true)
}
@objc func updateFrame() {
guard let currentItem = player.currentItem else { return }
let currentTime = player.currentTime()
// Use CMTime directly for itemTimeForDisplay
var timing = CMTimeMake(value: 0, timescale: 0) // Initialize a default CMTime
// Check if we have a video frame
if let pixelBuffer = output.copyPixelBuffer(forItemTime: currentTime, itemTimeForDisplay: &timing) {
processPixelBuffer(pixelBuffer)
}
}
func processPixelBuffer(_ pixelBuffer: CVPixelBuffer) {
// Convert the pixel buffer to a CIImage
let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
let context = CIContext()
// Create a CGImage from the CIImage
if let cgImage = context.createCGImage(ciImage, from: ciImage.extent) {
// Display the frame in the layer
displayLayer.contents = cgImage
}
}
}
struct VideoLayerViewRepresentable: UIViewRepresentable {
func makeUIView(context: Context) -> VideoLayerView {
return VideoLayerView()
}
func updateUIView(_ uiView: VideoLayerView, context: Context) {}
}
struct ContentView: View {
var body: some View {
VideoLayerViewRepresentable()
.edgesIgnoringSafeArea(.all)
}
}
#Preview {
ContentView()
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... ying-video
Как отобразить под прямоугольник (воспроизводимого) видео? ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу сделать так, чтобы звук из воспроизводимого видео был единственным активным
Anonymous » » в форуме CSS - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-