我是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>
1条答案
按热度按时间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内容中,如中所示:
为了显示我得到的结果,我在两个存储库中创建了一个带有两个按钮的用户控件:播放和停止。控件位置在底部,按钮使用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链接
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