Я пишу игру 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
Программируем под IOS
-
Anonymous
1751561914
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()
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79689174/how-to-display-a-sub-rectangle-of-a-playing-video[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия