Maui IOS размещает наложение поверх AVPlayerController в полноэкранном режиме.IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Maui IOS размещает наложение поверх AVPlayerController в полноэкранном режиме.

Сообщение Anonymous »

Я работаю над добавлением субтитров в Windows, Android, IOS и Mac Catalyst. У меня работает на windows и android. На ios работает отлично. За исключением случаев, когда я переключаюсь в полноэкранный режим, он не работает. Это было ожидаемо. Сейчас я пытаюсь заставить его работать в полноэкранном режиме. Насколько я понимаю, avplayer каким-то образом использует скрытый метод для отображения полноэкранной версии плеера. Я хочу каким-то образом отобразить субтитры поверх этого. Я не знаю, как это сделать.
У меня есть доступ к скрытым полноэкранным методам для Windows и Android. Я добавил статический обработчик событий, к которому я могу получить доступ для Windows и Android, который сообщает мне, когда он переходит в полноэкранный режим и выходит из него. Я использовал это, удалил старое представление и добавил новое к текущему представлению. Это сработало для обеих платформ.
Но в IOS я не знаю, как получить доступ к какой-либо информации о полноэкранных событиях или как их перехватить. Я пробовал различные методы, чтобы выяснить, есть ли общедоступные способы узнать, когда это произойдет. Я попытался измерить границы каждого элемента, к которому у меня есть доступ. Они не меняются при активации полноэкранного режима. Я почти уверен, что это скрытый метод, который одновременно активируется и отображает полноэкранный режим. Я хочу перехватить события, если это возможно, и добавить метод, который добавляет текстовое поле поверх скрытого слоя avplayer. Или, если у кого-то есть идеи, как лучше это сделать, я был бы признателен за любой отзыв.
Вот метод в том виде, в котором он используется для отображения текстового поля поверх avplayer. Это работает до тех пор, пока вы не переключитесь в полноэкранный режим.

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

using CommunityToolkit.Maui.Core;
using CommunityToolkit.Maui.Core.Views;
using CommunityToolkit.Maui.Primitives;
using CoreFoundation;
using CoreGraphics;
using CoreMedia;
using Foundation;
using UIKit;

namespace CommunityToolkit.Maui.Extensions;

/// 
/// A class that provides subtitle support for a video player.
/// 
public partial class SubtitleExtensions : UIViewController
{
readonly HttpClient httpClient;
readonly UIViewController playerViewController;
readonly PlatformMediaElement? player;
readonly UILabel subtitleLabel;
List cues;
NSObject? playerObserver;

/// 
/// The SubtitleExtensions class provides a way to display subtitles on a video player.
/// 
/// 
/// 
public SubtitleExtensions(PlatformMediaElement? player, UIViewController? playerViewController)
{
ArgumentNullException.ThrowIfNull(player);
ArgumentNullException.ThrowIfNull(playerViewController?.View?.Bounds);
this.playerViewController = playerViewController;
this.player = player;
cues = [];
httpClient = new HttpClient();
subtitleLabel = new UILabel
{
Frame = CalculateSubtitleFrame(playerViewController),
TextColor = UIColor.White,
TextAlignment = UITextAlignment.Center,
Font = UIFont.SystemFontOfSize(16),
Text = "",
Lines = 0,
AutoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleBottomMargin
};
}

/// 
/// Loads the subtitles from the provided URL.
/// 
/// 
public async Task LoadSubtitles(IMediaElement mediaElement)
{
string? vttContent;
try
{
vttContent = await httpClient.GetStringAsync(mediaElement.SubtitleUrl);
}
catch (Exception ex)
{
System.Diagnostics.Trace.TraceError(ex.Message);
return;
}

cues = mediaElement.SubtitleUrl switch
{
var url when url.EndsWith("srt") => SrtParser.ParseSrtContent(vttContent),
var url when url.EndsWith("vtt") => VttParser.ParseVttContent(vttContent),
_ => throw new NotSupportedException("Unsupported subtitle format"),
};
}

/// 
/// Starts the subtitle display.
/// 
public void StartSubtitleDisplay()
{
DispatchQueue.MainQueue.DispatchAsync(() => playerViewController.View?.AddSubview(subtitleLabel));
playerObserver = player?.AddPeriodicTimeObserver(CMTime.FromSeconds(1, 1), null, (time) =>
{
TimeSpan currentPlaybackTime = TimeSpan.FromSeconds(time.Seconds);
ArgumentNullException.ThrowIfNull(subtitleLabel);
subtitleLabel.Frame = CalculateSubtitleFrame(playerViewController);
DispatchQueue.MainQueue.DispatchAsync(() => UpdateSubtitle(currentPlaybackTime));
});
}

/// 
/// Stops the subtitle display.
/// 
public void StopSubtitleDisplay()
{
ArgumentNullException.ThrowIfNull(player);
if (playerObserver is not null)
{
player.RemoveTimeObserver(playerObserver);
playerObserver.Dispose();
playerObserver = null;
subtitleLabel.RemoveFromSuperview();
}
}
void UpdateSubtitle(TimeSpan currentPlaybackTime)
{
ArgumentNullException.ThrowIfNull(subtitleLabel);
ArgumentNullException.ThrowIfNull(playerViewController.View);
foreach (var cue in cues)
{
if (currentPlaybackTime >= cue.StartTime &&  currentPlaybackTime 

Подробнее здесь: [url]https://stackoverflow.com/questions/78449588/maui-ios-place-overlay-on-top-of-avplayercontroller-when-in-full-screen-mode[/url]
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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