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

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

Сообщение 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()
}
}



Подробнее здесь: https://stackoverflow.com/questions/796 ... ying-video
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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