Как реализовать «Картинка в картинке» (PiP) во Flutter для iOS с помощью LiveKit без URL-адреса видео?IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать «Картинка в картинке» (PiP) во Flutter для iOS с помощью LiveKit без URL-адреса видео?

Сообщение Anonymous »

Я создаю приложение для видеоконференций с использованием LiveKit во Flutter и хочу реализовать режим «картинка в картинке» (PiP) на iOS. Моя цель — отобразить представление, показывающее инициалы или аватар говорящего в режиме PiP. Я успешно реализовал эту функцию на Android, но с трудом реализую ее на iOS.
Я использую MethodChannel для взаимодействия с собственным кодом iOS. Вот код Flutter:

Код: Выделить всё

import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';

class PipController {
static const _channel = MethodChannel('pip_channel');

static Future startPiP() async {
try {
await _channel.invokeMethod('enterPiP');
} catch (e) {
if (kDebugMode) {
print("Error starting PiP: $e");
}
}
}

static Future stopPiP() async {
try {
await _channel.invokeMethod('exitPiP');
} catch (e) {
if (kDebugMode) {
print("Error stopping PiP: $e");
}
}
}
}

На стороне iOS я использую AVPictureInPictureController. Поскольку для этого требуется AVPlayerLayer, мне пришлось включить фиктивный URL-адрес видео для инициализации AVPlayer. Однако это приводит к тому, что звук фиктивного видео воспроизводится в фоновом режиме, но в режиме PiP изображение не отображается.
Вот мой код для iOS:

Код: Выделить всё

import Flutter
import UIKit
import AVKit

@main
@objc class AppDelegate: FlutterAppDelegate {

var pipController: AVPictureInPictureController?
var playerLayer: AVPlayerLayer?

override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {

let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
let pipChannel = FlutterMethodChannel(name: "pip_channel", binaryMessenger: controller.binaryMessenger)

pipChannel.setMethodCallHandler { [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) in
if call.method == "enterPiP" {
self?.startPictureInPicture(result: result)
} else if call.method == "exitPiP" {
self?.stopPictureInPicture(result: result)
} else {
result(FlutterMethodNotImplemented)
}
}

GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}

private func startPictureInPicture(result: @escaping FlutterResult) {
guard AVPictureInPictureController.isPictureInPictureSupported() else {
result(FlutterError(code: "UNSUPPORTED", message: "PiP is not supported on this device.", details: nil))
return
}

// Set up the AVPlayer
let player = AVPlayer(url: URL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")!)
let playerLayer = AVPlayerLayer(player: player)
self.playerLayer = playerLayer

// Create a dummy view
let dummyView = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
dummyView.isHidden = true
window?.rootViewController?.view.addSubview(dummyView)
dummyView.layer.addSublayer(playerLayer)
playerLayer.frame = dummyView.bounds

// Initialize PiP Controller
pipController = AVPictureInPictureController(playerLayer: playerLayer)
pipController?.delegate = self

// Start playback and PiP
player.play()
pipController?.startPictureInPicture()
print("Picture-in-Picture started")
result(nil)
}

private func stopPictureInPicture(result: @escaping FlutterResult) {
guard let pipController = pipController, pipController.isPictureInPictureActive else {
result(FlutterError(code: "NOT_ACTIVE", message: "PiP is not currently active.", details: nil))
return
}

pipController.stopPictureInPicture()
playerLayer = nil
self.pipController = nil
result(nil)
}
}

extension AppDelegate: AVPictureInPictureControllerDelegate {
func pictureInPictureControllerDidStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
print("PiP started")
}

func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {
print("PiP stopped")
}
}
Вопросы:
  • Как реализовать режим PiP на iOS без использования видео URL (или AVPlayerLayer)?
  • Есть ли способ отобразить пользовательский UIView (например, инициалы говорящего или аватар) в режиме PiP вместо требования видео?
  • Почему PiP не отображать просмотр, даже если URL-адрес фиктивного видео воспроизводится в фоновом режиме?
Я новичок в разработке для iOS и буду очень признателен за любые рекомендации или альтернативы. подходы к достижению этой функциональности. Спасибо!

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

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

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

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

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

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

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