Я хочу использовать ландшафтное видео в качестве анимированной текстуры фона для uiview. src = "https://i.sstatic.net/ykoatdu0.png"/>
AVPlayer и avplayerlayer , кажется, делают жесткие предположения, что, если я настаиваю на том, чтобы не хотеть полного кадры видео, меня нужно заинтересовать только в центральной части видео: я могу либо иметь видео, подходящее к ширине (потому что это более широкое измерение), либо подходящее к высоте, но центрировано. Я что-то упускаю?
import SwiftUI
import AVFoundation
class CroppedVideoViewModel: ObservableObject {
@Published var videoSize: CGSize = .zero
func loadVideo(url: URL) {
let asset = AVAsset(url: url)
let track = asset.tracks(withMediaType: .video).first
let size = track?.naturalSize ?? CGSize.zero
self.videoSize = size
}
}
struct ContentView: View {
@StateObject var viewModel = CroppedVideoViewModel()
var body: some View {
ZStack {
if viewModel.videoSize != .zero {
let aspectRatio = viewModel.videoSize.width / viewModel.videoSize.height
let screenHeight = UIScreen.main.bounds.height
let screenWidth = screenHeight * aspectRatio
CroppedVideoRepresentable(viewModel: viewModel)
.frame(width: screenWidth, height: screenHeight)
.position(x: UIScreen.main.bounds.width / 2, y: screenHeight / 2)
}
}
.onAppear {
if let url = Bundle.main.url(forResource: "example", withExtension: "MP4") {
viewModel.loadVideo(url: url)
} else {
print("Video not found!")
}
}
}
}
struct CroppedVideoRepresentable: UIViewRepresentable {
@ObservedObject var viewModel: CroppedVideoViewModel
func makeUIView(context: Context) -> UIView {
return CroppedVideo(viewModel: viewModel, frame: CGRect(x: 0, y: 0, width: viewModel.videoSize.width, height: viewModel.videoSize.height))
}
func updateUIView(_ uiView: UIView, context: Context) {
}
}
class CroppedVideo: UIView {
@ObservedObject var viewModel: CroppedVideoViewModel
private var videoLayer: AVPlayerLayer!
init(viewModel: CroppedVideoViewModel, frame: CGRect) {
self.viewModel = viewModel
super.init(frame: frame)
self.backgroundColor = .black
videoLayer = AVPlayerLayer()
videoLayer.frame = CGRect(x: 0, y: 0, width: viewModel.videoSize.width, height: viewModel.videoSize.height)
self.layer.addSublayer(videoLayer)
if let url = Bundle.main.url(forResource: "example", withExtension: "MP4") {
loadAndPlayVideo(url: url)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func loadAndPlayVideo(url: URL) {
let player = AVPlayer(url: url)
videoLayer.player = player
player.play()
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... ying-video
Как отобразить под прямоугольник (воспроизводимого) видео? ⇐ IOS
Программируем под IOS
-
Anonymous
1751579400
Anonymous
Я хочу использовать ландшафтное видео в качестве анимированной текстуры фона для uiview. src = "https://i.sstatic.net/ykoatdu0.png"/>
AVPlayer и avplayerlayer , кажется, делают жесткие предположения, что, если я настаиваю на том, чтобы не хотеть полного кадры видео, меня нужно заинтересовать только в центральной части видео: я могу либо иметь видео, подходящее к ширине (потому что это более широкое измерение), либо подходящее к высоте, но центрировано. Я что-то упускаю?
import SwiftUI
import AVFoundation
class CroppedVideoViewModel: ObservableObject {
@Published var videoSize: CGSize = .zero
func loadVideo(url: URL) {
let asset = AVAsset(url: url)
let track = asset.tracks(withMediaType: .video).first
let size = track?.naturalSize ?? CGSize.zero
self.videoSize = size
}
}
struct ContentView: View {
@StateObject var viewModel = CroppedVideoViewModel()
var body: some View {
ZStack {
if viewModel.videoSize != .zero {
let aspectRatio = viewModel.videoSize.width / viewModel.videoSize.height
let screenHeight = UIScreen.main.bounds.height
let screenWidth = screenHeight * aspectRatio
CroppedVideoRepresentable(viewModel: viewModel)
.frame(width: screenWidth, height: screenHeight)
.position(x: UIScreen.main.bounds.width / 2, y: screenHeight / 2)
}
}
.onAppear {
if let url = Bundle.main.url(forResource: "example", withExtension: "MP4") {
viewModel.loadVideo(url: url)
} else {
print("Video not found!")
}
}
}
}
struct CroppedVideoRepresentable: UIViewRepresentable {
@ObservedObject var viewModel: CroppedVideoViewModel
func makeUIView(context: Context) -> UIView {
return CroppedVideo(viewModel: viewModel, frame: CGRect(x: 0, y: 0, width: viewModel.videoSize.width, height: viewModel.videoSize.height))
}
func updateUIView(_ uiView: UIView, context: Context) {
}
}
class CroppedVideo: UIView {
@ObservedObject var viewModel: CroppedVideoViewModel
private var videoLayer: AVPlayerLayer!
init(viewModel: CroppedVideoViewModel, frame: CGRect) {
self.viewModel = viewModel
super.init(frame: frame)
self.backgroundColor = .black
videoLayer = AVPlayerLayer()
videoLayer.frame = CGRect(x: 0, y: 0, width: viewModel.videoSize.width, height: viewModel.videoSize.height)
self.layer.addSublayer(videoLayer)
if let url = Bundle.main.url(forResource: "example", withExtension: "MP4") {
loadAndPlayVideo(url: url)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func loadAndPlayVideo(url: URL) {
let player = AVPlayer(url: url)
videoLayer.player = player
player.play()
}
}
Подробнее здесь: [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антехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия