Остановите запись экрана в ReplayKit iOS с помощью flutter appDelegate и цели ScreenShareIOS

Программируем под IOS
Ответить
Гость
 Остановите запись экрана в ReplayKit iOS с помощью flutter appDelegate и цели ScreenShare

Сообщение Гость »


Я работаю над записью экрана в ReplayKit iOS с интеграцией по flutter. Данные записи экрана будут отправлены обратно на сервер, и приложение отлично работает при записи начального экрана. Оно работает путем вызова функции обработки данных в цели ScreenShare в ReplayKit. Однако я не могу найти способ, чтобы флаттер отправлял ответ на iOS и прекращал запись вызова в iOS в ReplayKit.

Вот мой код:

AppDelegate:

@objc class AppDelegate: FlutterAppDelegate { статический let kBroadcastExtensionBundleId = "****" статический let kBroadcastExtensionSetupUiBundleId = "****" вар BroadcastController: RPBroadcastController? пусть сборщик = RPSystemBroadcastPickerView() переопределить приложение func (_ приложение: UIApplication, DidFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { /* Реализация Poard Share */ пусть общийUserDefaults: UserDefaults? = UserDefaults(suiteName: "****") пусть контроллер: FlutterViewController = окно?.rootViewController как! Флаттервиевконтроллер let методChannel = FlutterMethodChannel (имя: "flutter_custom_recordor",binaryMessenger: контроллер.binaryMessenger) if letdictionaryRepresentation =sharedUserDefaults?.dictionaryRepresentation() { // Цикл по клавишам для ключа вdictionRepresentation.keys { print("Ключ: \(ключ)") // Если вы хотите получить соответствующее значение if let value =sharedUserDefaults?.value(forKey:key) { print("Значение: \(значение)") } } } // вызов метода флаттера MethodChannel.setMethodCallHandler({ [weak self](вызов: FlutterMethodCall, результат: @escaping FlutterResult) -> Void in print("метод \(call.method)") переключить вызов.метод { случай «начало»: если пусть video_config = call.arguments как? [Строка: любая] { SharedUserDefaults?.set(_:video_config, forKey: "***") общийUserDefaults?.synchronize() let rtmpURL = String(описание: video_config["***"]) print("Начало вызова! \(video_config) \(rtmpURL)") // отправляем действие, чтобы показать средство выбора для просмотра самостоятельно?.picker.subviews ?? [] { если кнопка let = просмотреть как? UIButton { button.sendActions(для: .allEvents) результат (правда) } } } случай «стоп»: print("Вызов стоп!") если let контроллер=self?.broadcastController{ контроллер.finishBroadcast{ошибка в печать("ssds") } }еще{ печать("дфф") } по умолчанию: результат (FlutterMethodNotImplemented) } } ) /* Реализация Poard Share */ GeneratedPluginRegistrant.register(с: self) // показываем кнопку выбора записи для iOS12+ self.iOS12PickerView() NotificationCenter.default.addObserver(self, селектор: #selector(broadcastFinished), имя: NSNotification.Name("broadcastFinished"), объект: ноль) вернуть super.application(application, DidFinishLaunchingWithOptions: launchOptions) } функция iOS12PickerView() { // пусть контроллер: FlutterViewController = window?.rootViewController as! Флаттервиевконтроллер // Picker.preferredExtension = AppDelegate.kBroadcastExtensionBundleId // Picker.isHidden = ложь // контроллер.view.addSubview(выборщик) пусть контроллер: FlutterViewController = окно?.rootViewController как! Флаттервиевконтроллер var Picker = RPSystemBroadcastPickerView.init(frame: CGRect(x: 100, y: 200, ширина: 200, высота: 100)) Picker.preferredExtension = ViewController.kBroadcastExtensionBundleId контроллер.view.addSubview(выборщик) } } Когда я вызываю функцию запуска на платформе iOS, появляется окно выбора, запись экрана начинается, если я нажимаю кнопку начала записи в средстве выбора, и он вызывает обработчик образца в цели ScreenShare для обработки видео. data и будет вызвана функция BroadcastStarted.

SampleHandler:

класс SampleHandler: RPBroadcastSampleHandler { // Какие образцы аудио мы будем захватывать. В примере не смешиваются несколько типов выборок. статический let kAudioSampleType = RPSampleBufferType.audioMic вар videoEnabled: Bool = true вар audioEnabled: Bool = true общедоступная вар liveSession: LFLiveSession? func clientHasError (_ сообщение: String) { пусть userInfo = [NSLocalizedFailureReasonErrorKey: сообщение] FinishBroadcastWithError (NSError (домен: «ScreenShare», код: -99, userInfo: userInfo)) } funcPublishStarted (streamId: String) { NSLog("Публикация началась") } funcPublishFinished (streamId: String) { NSLog("Публикация завершена") } func dataReceivedFromDataChannel (streamId: String, data: Data, двоичный: Bool) { } func ConnectAndStartBroadcast (withSetupInfo setupInfo: [String: NSObject]?) { print("broadcastStartedWithSetupInfo: ", setupInfo как любой) } переопределить func BroadcastStarted (withSetupInfo setupInfo: [String: NSObject]?) { пусть общийUserDefaults: UserDefaults? = UserDefaults(suiteName: "***") let video_config_raw =sharedUserDefaults?.value(forKey: "video_config") SharedUserDefaults?.set(_:"****", forKey: "brocastAppId") общийUserDefaults?.synchronize() если (video_config_raw != ноль) { пусть video_config = video_config_raw как! [Строка: любая] print("broadcastStarted!!!! \(video_config) ") if (self.liveSession == nil || !(self.liveSession?.running ?? true)) { var videoWidth = UIScreen.main.bounds.width var videoHeight = UIScreen.main.bounds.height если пусть ширина = video_config["ширина"] как? Int { videoWidth = Double (ширина) } если пусть высота = video_config["высота"] как? Int { videoHeight = Double (высота) } пусть videoConfig = LFLiveVideoConfiguration.default() videoConfig?.videoSize.width = videoHeight videoConfig?.videoSize.height = videoWidth пусть audioConfig = LFLiveAudioConfiguration.default() self.liveSession = LFLiveSession.init(audioConfiguration: audioConfig, videoConfiguration: videoConfig) пустьstreamInfo = LFLiveStreamInfo.init() если пусть rtmpURL = video_config["rtmpURL"] как? Нить { SharedUserDefaults?.set(_:rtmpURL, forKey: "brocastAppIdRun") streamInfo.url = rtmpURL self.liveSession?.running = true; self.liveSession?.startLive(streamInfo); } еще { print("отсутствует rtmpURL") } } еще { print("Уже началось!!!!!"); } } } переопределить функцию BroadcastPaused() { // Пользователь запросил приостановку трансляции. Образцы перестанут доставляться. // self.audioTrack?.isEnabled = false // self.screenTrack?.isEnabled = false } переопределить функцию BroadcastResumed() { // Пользователь запросил возобновление трансляции. Доставка образцов возобновится. // self.audioTrack?.isEnabled = true // self.screenTrack?.isEnabled = true } переопределить функцию BroadcastFinished() { self.liveSession?.stopLive() print("трансляция завершена!!!!"); NSLog("трансляция завершена!!!!"); NotificationCenter.default.post(имя: NSNotification.Name("broadcastFinished"), объект: ноль) } переопределить funcprocessSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) { Я пытался использовать BroadcastController.finishRecording, чтобы остановить запись, но оказалось, что контроллер имеет значение null, и я не подключаю к нему контроллер при запуске, поэтому я думаю, нужно ли мне подключать его во время начните запись точно так же, как какой-либо источник, используя функцию ниже, но я не знаю, где я ее вызываю, и функция запуска на самом деле работает нормально:

func BroadcastActivityViewController(_ BroadcastActivityViewController: RPBroadcastActivityViewController, DidFinishWith BroadcastController: RPBroadcastController?, ошибка: Ошибка?) { // self.broadcastController=broadcastController print("ssss \(broadcastController.hashValue)") ошибка охранника == ноль else { print("Контроллер активности вещания недоступен.") возвращаться } //2 BroadcastActivityViewController.dismiss (анимированный: правда) { //3 BroadcastController?.startBroadcast {ошибка в //4 //TODO: загрузка трансляции может занять несколько секунд. Я рекомендую вам добавить индикатор активности или что-то подобное, чтобы показать пользователю, что он загружается. //5 если ошибка == ноль { print("Трансляция началась успешно!") // self.broadcastStarted() } } } } Другой подход заключается в прямом вызове функции FinishedBroadcast в классе SampleHandler в цели ScreenShare, но я не знаю, как это сделать.
Ответить

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

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

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

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

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