Я пытаюсь воспроизвести видео в своем приложении MAUI (в настоящее время на Android), используя MediaElement из MAUI CommunityToolkit, а поток, который я передаю в качестве источника, представляет собой RTSP с камеры, подключенной через точку доступа Wi-Fi.
Я преобразовал исходный URL-адрес с помощью MediaSource.FromUri
, но все равно не работает, все, что я вижу, это красный экран.
Более того, представление, в котором я пытаюсь воспроизвести видео, является ContentView, поэтому это компонент внутри ContentPage.
<ContentPage>
...
<components:StreamView />
...
</ContentPage>
по поводу ошибок, я вижу ошибку
[MediaSessionCompat] Couldn't find a unique registered media button receiver in the given context.
[0:] MediaManager: Error: AndroidX.LocalBroadcastManager.Content.LocalBroadcastManager not supported on Android 13 and above.
и
[ExoPlayerImplInternal] Playback error
[ExoPlayerImplInternal] com.google.android.exoplayer2.ExoPlaybackException: Source error
[ExoPlayerImplInternal] at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:684)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:660)
[ExoPlayerImplInternal] at android.os.Handler.dispatchMessage(Handler.java:102)
[ExoPlayerImplInternal] at android.os.Looper.loopOnce(Looper.java:226)
[ExoPlayerImplInternal] at android.os.Looper.loop(Looper.java:313)
[ExoPlayerImplInternal] at android.os.HandlerThread.run(HandlerThread.java:67)
[ExoPlayerImplInternal] Caused by: java.io.IOException: java.lang.IllegalArgumentException: missing profile-level-id param
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspMediaPeriod$InternalListener.onSessionTimelineRequestFailed(RtspMediaPeriod.java:695)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient.dispatchRtspError(RtspClient.java:330)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient.access$700(RtspClient.java:84)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:690)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspMessage(RtspClient.java:523)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.lambda$onRtspMessageReceived$0$com-google-android-exoplayer2-source-rtsp-RtspClient$MessageListener(RtspClient.java:516)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener$$ExternalSyntheticLambda0.run(Unknown Source:4)
[ExoPlayerImplInternal] at android.os.Handler.handleCallback(Handler.java:942)
[ExoPlayerImplInternal] at android.os.Handler.dispatchMessage(Handler.java:99)
[ExoPlayerImplInternal] ... 3 more
[ExoPlayerImplInternal] Caused by: com.google.android.exoplayer2.source.rtsp.RtspMediaSource$RtspPlaybackException: java.lang.IllegalArgumentException: missing profile-level-id param
[ExoPlayerImplInternal] ... 9 more
[ExoPlayerImplInternal] Caused by: java.lang.IllegalArgumentException: missing profile-level-id param
[ExoPlayerImplInternal] at com.google.android.exoplayer2.util.Assertions.checkArgument(Assertions.java:62)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspMediaTrack.processAacFmtpAttribute(RtspMediaTrack.java:337)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspMediaTrack.generatePayloadFormat(RtspMediaTrack.java:245)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspMediaTrack.<init>(RtspMediaTrack.java:175)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient.buildTrackList(RtspClient.java:362)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient.access$1700(RtspClient.java:84)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.onDescribeResponseReceived(RtspClient.java:724)
[ExoPlayerImplInternal] at com.google.android.exoplayer2.source.rtsp.RtspClient$MessageListener.handleRtspResponse(RtspClient.java:630)
[ExoPlayerImplInternal] ... 8 more
и после поиска я нашел предложенное обходное решение, которое также не помогло обходной путь, упомянутый здесь: https://github.com/CommunityToolkit/Maui/issues/2143
Я проверил, что подключаюсь к камере во время потоковой передачи/попытки воспроизведения видео.
Вот мой StreamView.xaml:
<?xml version = "1.0" encoding = "UTF-8"?>
<ContentView xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class = "MyApp.UI.Components.StreamView">
<ContentView.Content>
<StackLayout
HorizontalOptions = "FillAndExpand"
VerticalOptions = "FillAndExpand"
HeightRequest = "185">
<StackLayout.BackgroundColor>
<OnPlatform x:TypeArguments = "Color">
<OnPlatform.Platforms>
<On Platform = "iOS" Value = "Black" />
<On Platform = "Android" Value = "Transparent" />
</OnPlatform.Platforms>
</OnPlatform>
</StackLayout.BackgroundColor>
<toolkit:MediaElement
x:Name = "mediaElement"
MetadataArtworkUrl = "https://lh3.googleusercontent.com/pw/AP1GczNRrebWCJvfdIau1EbsyyYiwAfwHS0JXjbioXvHqEwYIIdCzuLodQCZmA57GADIo5iB3yMMx3t_vsefbfoHwSg0jfUjIXaI83xpiih6d-oT7qD_slR0VgNtfAwJhDBU09kS5V2T5ZML-WWZn8IrjD4J-g=w1792-h1024-s-no-gm" />
</StackLayout>
</ContentView.Content>
</ContentView>
и StreamView.xaml.cs:
using CommunityToolkit.Maui.Views;
using MyApp.Core;
namespace MyApp.UI.Components
{
public partial class StreamView : ContentView
{
public StreamView()
{
InitializeComponent();
BindingContext = this;
mediaElement.Source = MediaSource.FromUri(Constants.StreamUrl);
}
}
}
@LiyunZhang-MSFT MAUI CommunityToolkit MediaElement использует ExoPlayer для Android, судя по тому, что я читал, изначально я использовал пакет LibVLCSharp, но VideoView еще не поддерживается в MAUI (опять же, судя по тому, что я читал). И альтернативы MediaElement я не нашел.
После некоторых исследований и расследований я пришел к решению.
Но для некоторого контекста, прежде чем использовать MediaElement
из MAUI CommunityToolKit.
Я использовал пакет LibVLCSharp
с элементом VideoView
.
При поиске я прочитал, что элемент VideoView не поддерживается в MAUI, но я все равно пытался его использовать и получил ошибку, что для элемента VideoView нет VideoViewHandler, из-за этой ошибки я подумал, что это ошибка, которая привела к тому, что он не поддерживается. на МАУИ
Короче говоря, видимо, все, что мне нужно было сделать, это настроить VideoViewHandler (который уже был реализован в пакете LibVLCSharp.MAUI) в MauiProgram.cs (который я не нашел в документации LibVLCSharp)
var builder = MauiApp.CreateBuilder();
// In order to use VideoView element in the needed pages, we need
// to configure the VideoViewHandler from the LibVLCSharp.MAUI NuGet package
builder.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler(typeof(VideoView), typeof(VideoViewHandler));
});
В журнале показано: com.google.android.exoplayer2.ExoPlaybackException: ошибка источника. Пробовали ли вы какие-то другие источники?