Как отобразить под прямоугольник (воспроизводимого) видео?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как отобразить под прямоугольник (воспроизводимого) видео?

Сообщение Anonymous »

Я пишу игру 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»