XAML AvaloniaUI:无法在UserControl中嵌入VideoView控件(LibVlcSharp)

to94eoyn  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(347)

我是AvaloniaUI 0.10.5的新手。目前我正在macOS上的一个应用程序中使用VideoView控件(LibVLCSharp. Avalonia 3.5.0)。代码是Donadren示例2的副本:(https://github.com/donandren/vlcsharpavalonia/tree/master/samples/LibVLCSharp.Avalonia.Sample)中的一个。
视频播放器在窗口控件中运行良好,但当我将代码复制到UserControl中(以便在应用程序的其他位置重用播放器)时,我听到了视频的声音,但没有图像。在控制台中,我遇到了以下错误:

[h264 @ 0x7ff85e8d3600] get_buffer () failed
[h264 @ 0x7ff85e8d3600] thread_get_buffer () failed
[h264 @ 0x7ff85e8d3600] decode_slice_header error
[h264 @ 0x7ff85e8d3600] no frame!

我试着在网上搜索,但什么也找不到。
你能帮助我吗,谢谢,对不起,我的英语不好。

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:viewModels="clr-namespace:Avalonia.NETCoreMVVMApp3.ViewModels"
             xmlns:avalonia="clr-namespace:LibVLCSharp.Avalonia;assembly=LibVLCSharp.Avalonia"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="Avalonia.NETCoreMVVMApp3.Views.VlcControl">
    <Design.DataContext>
        <viewModels:VlcControlViewModel/>
    </Design.DataContext>
    <Grid RowDefinitions="*, Auto">
      <avalonia:VideoView x:Name="VideoView" Grid.Row="0" MediaPlayer="{Binding MediaPlayer}">
      </avalonia:VideoView>
      <Grid Grid.Row="1" RowDefinitions="Auto,Auto,Auto">
        <Grid Grid.Row="0" ColumnDefinitions="Auto,*,Auto">
          <TextBlock Text="File (url):" Grid.Column="0" VerticalAlignment="Center" />
          <AutoCompleteBox Name="mediaUrl" Text="{Binding MediaUrl, Mode=TwoWay}" Items="{Binding Played}" FilterMode="Contains" Grid.Column="1" IsDropDownOpen="False" />
          <Button Content="Open File" Command="{Binding OpenCommand}" Grid.Column="2" />
        </Grid>
        <Grid Grid.Row="1" ColumnDefinitions="Auto,*,Auto">
          <TextBlock Text="{Binding CurrentTime}" Grid.Column="0" />
          <TextBlock Text="{Binding Duration}" Grid.Column="2" />
          <Slider Minimum="0" Maximum="100" Value="{Binding Position}" Grid.Column="1" />
        </Grid>
        <Grid Grid.Row="2" ColumnDefinitions="Auto, *,Auto">
          <StackPanel Orientation="Horizontal" Grid.Column="0" Spacing="5">
            <Button Content="Play" Command="{Binding PlayCommand}" />
            <Button Content="Stop" Command="{Binding StopCommand}" />
            <Button Content="Pause" Command="{Binding PauseCommand}" />
            <Button Content="-1s" Command="{Binding BackwardCommand}" />
            <Button Content="+1s" Command="{Binding ForwardCommand}" />
            <Button Content="Next Frame" Command="{Binding NextFrameCommand}" />
          </StackPanel>

          <Grid ColumnDefinitions="Auto,*" Grid.Column="1">
            <TextBlock Text="{Binding State, StringFormat='State:\{0\}'}" Grid.Column="0" VerticalAlignment="Center" />
            <ScrollViewer Grid.Column="1" MaxHeight="40" HorizontalScrollBarVisibility="Disabled">
              <TextBlock Margin="5,0,0,0" Text="{Binding Information}" TextWrapping="Wrap" VerticalAlignment="Center" />
            </ScrollViewer>
          </Grid>

          <StackPanel Orientation="Horizontal" Grid.Column="2" Spacing="2">
            <StackPanel Orientation="Horizontal">
              <TextBlock Text="Rendering:" VerticalAlignment="Center" />
              <ComboBox SelectedIndex="{Binding #VideoView.VlcRenderingOptions}">
                <ComboBoxItem Content="{x:Static avalonia:LibVLCAvaloniaRenderingOptions.VlcNative}" />
                <ComboBoxItem Content="{x:Static avalonia:LibVLCAvaloniaRenderingOptions.Avalonia}" />
                <ComboBoxItem Content="{x:Static avalonia:LibVLCAvaloniaRenderingOptions.AvaloniaCustomDrawingOperation}" />
              </ComboBox>
            </StackPanel>
            <CheckBox Content="Stats" IsChecked="{Binding #VideoView.DisplayRenderStats}" />
            <CheckBox Content="Volume:" IsChecked="{Binding !IsMuted, Mode=TwoWay}" />
            <Slider IsEnabled="{Binding !IsMuted}" Minimum="0" Maximum="100" Width="200" Value="{Binding Volume}" VerticalAlignment="Center">
              <Slider.Styles>
                <Style Selector="Slider:disabled">
                  <Setter Property="Opacity" Value="0.5" />
                </Style>
              </Slider.Styles>
            </Slider>
          </StackPanel>
        </Grid>
      </Grid>
  </Grid>
</UserControl>
xyhw6mcr

xyhw6mcr1#

众所周知,Avalonia的问题是无法在Avalonia UserControl(仅在窗口中)中使用VideoView,以及无法在VLC MediaPlayer顶部的层中使用控件。
凭借一点“运气”,我设法找到了一个相当优雅的方法(也许是许多可能的方法之一,尽管目前还没有)来解决所有这些问题。
因此,在Github上,我创建了2个仓库来共享和展示如何

*在Avalonia窗口中嵌入LibVLCSharp Avalonia VLC视频视图AvaVLCWindow
*在Avalonia用户控件中嵌入LibVLCSharp Avalonia VLC视频视图AvaVLCControl
*在VideoView(VLC MediaPlayer)上放置并使用Avalonia UserControl,例如,一组按钮/控件来控制VLC MediaPlayer(在两个存储库中)。

请随意探索和理解代码并构建/运行它。VS 2019 needed.
标准的 VideoView.cs 代码(来自 LibVLCSharp.Avalonia 标准项目)已经过修改,以达到所列的结果,修改后的(非常小的)LibVLCSharp.Avalonia项目已经包含在两个repos中。
为了给予将Avalonia UserControl放在VLC MediaPlayer的顶部,我向VideoView添加了一个新的 Content 属性,它将创建和处理自己的新顶部窗口,并将 Content 添加到此窗口。
您可以将 Content 创建为新的UserControl(例如,一组MediaPlayer控件),并将此UserControl添加到VideoView内容中,如中所示:

<vlcsharp:VideoView
   HorizontalAlignment="Stretch"
   VerticalAlignment="Stretch"
   x:Name="VideoViewer">

   <!-- Content -->
   <Panel
    VerticalAlignment="Bottom"
    Opacity="0.8"
    Background="Gray">
    <controls:PlayerControls/>
   </Panel>
</vlcsharp:VideoView>

为了显示我得到的结果,我在两个存储库中创建了一个带有两个按钮的用户控件:播放和停止。控件位置在底部,按钮使用PointerEnter/PointerLeave事件显示,因此移动鼠标时按钮将显示/隐藏在正确的位置。我使用了一个简单的非动画不透明度,设置为0.8(Enter)和0(Leave)。
你可以添加一些动画和/或扩展功能。我懒得在repos中做这些,因为它们只是概念证明(概念证明)。

:所有内容均已在Windows 10、Kubuntu 18.04、MacOS 10.13、Raspberry Pi 3 Model B DietPi(MATE)上进行了测试,代码源没有任何更改。
编辑:Kubuntu 18.04上成功测试

已在MacOS 10.13(High Sierra)上成功测试

**编辑:**在乌藨子DietPi(MATE或Xfce)上成功测试

之前的Raspbian Stretch测试不起作用(透明度和不透明度不起作用,播放充满了抖动和像素化)
使用DietPi和MATE(或Xfce),覆盖控件(按钮)的透明度和不透明度属性得到了充分的尊重。播放是平滑的,没有抖动,中断或任何东西。
作为root用户,我安装了libx11-dev, libvlc-dev and vlc,复制了发布的示例(在Windows 10中使用dotnet publish -c release -f net5.0 -r linux-arm构建)chmod 777 the whole folder content,并运行了该示例。必须以root用户身份或使用sudo运行该示例。

编辑日期:2022年4月27日

  • 非官方Avalonia LibVLCSharp* 的The new release,允许在Avalonia应用程序中使用LibVLCSharp播放的视频场景上显示多个可拖动控件。

任何人都有兴趣,好好享受吧。

更新了所有链接(最新的库和示例版本)

非官方的Avalonia LibVLCSharp链接

Avalonia窗口内的VLC视频播放器/UserControl嵌入单个静态可定制控件(例如播放器按钮)LibVLCSharp.Avalonia.Unofficial
Avalonia窗口内的VLC视频播放器/UserControl嵌入多个可拖动的自定义控件(例如播放器按钮、图像等)LibVLCSharp.Avalonia.Unofficial.UCanvas
LibVLCSharp.阿瓦隆尼亚.非官方样品LibVLCSharp.Avalonia.Unofficial.Samples
LibVLCSharp.阿瓦隆尼亚.非官方.UCanvas示例LibVLCSharp.Avalonia.Unofficial.UCanvas.Samples
YAMP 2 -使用LibVLCSharp的开源视频播放器示例。Avalonia。非官方库Github sourcesWatch YAMP2 in action

相关问题