首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibVLCSharp播放列表实现

LibVLCSharp播放列表实现
EN

Stack Overflow用户
提问于 2021-04-17 03:16:17
回答 1查看 183关注 0票数 0

我正在尝试使用带有播放列表的LibVLCSharp (或者这就是我的计划),并且正在使用两个不同视频之间的基本循环来测试它。我在WPF中使用了这个。UI有一个按钮,用于开始第一个视频播放。如果我每次都不循环并单击按钮,则下一个视频将按预期播放。让它循环,在第二个视频上出现线程错误。我已经查看了SO - How to achieve looping playback with Libvlcsharp上的其他一些帖子和里面的各种链接,但我遗漏了一些东西。我希望有人有一个或两个建议!谢谢。

代码语言:javascript
复制
XAML
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        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:wpf="clr-namespace:LibVLCSharp.WPF;assembly=LibVLCSharp.WPF"
        xmlns:local="clr-namespace:testVLC"
        xmlns:Properties="clr-namespace:testVLC.Properties" x:Class="testVLC.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width=".2*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width=".2*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height=".25*"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height=".25*"/>
            <RowDefinition Height=".25*"/>
        </Grid.RowDefinitions>
        <wpf:VideoView x:Name="VLC_player" Grid.Column="1" Grid.ColumnSpan="4" Grid.Row="0" Grid.RowSpan="3" Background="Black" Loaded="VLC_player_Loaded"/>
        <Button x:Name="go_Btn" Content="Press to view video" Grid.Column="2" HorizontalAlignment="Right"  Grid.Row="3" Padding="4,1" Margin="0,0,1,0" Click="Button_click"/>
        <TextBox x:Name="countTBox" Grid.Column="2" HorizontalAlignment="Left"  Grid.Row="3" Width="30" VerticalContentAlignment="Stretch"/>


    </Grid>
</Window>


CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using LibVLCSharp.Shared;
using MediaPlayer = LibVLCSharp.Shared.MediaPlayer;

namespace testVLC
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        LibVLC _libVLC;
        MediaPlayer media_player;
        bool init_flag = false;
        bool Web_flag = false;
        int count = 0;

        public MainWindow()
        {
            InitializeComponent();
        }


        private async void Media_play (string URI)
        {
            if (init_flag)
            {
                if(Web_flag)
                {
                    _libVLC = new LibVLC("--verbose=2");
                    Media media = new Media(_libVLC, (URI), FromType.FromLocation);
                    await media.Parse(MediaParseOptions.ParseNetwork);

                    media_player = new MediaPlayer(media.SubItems.First());
                    VLC_player.MediaPlayer = media_player;
                    media_player.EndReached += Video_Ended;
                    media_player.Play();
                    //MessageBox.Show(Thread.CurrentThread.Name);
                }
                else
                {
                    _libVLC = new LibVLC();
                    media_player = new MediaPlayer(_libVLC);

                    VLC_player.MediaPlayer = media_player;
                    media_player.EndReached += Video_Ended;
                    media_player.Play(new Media(_libVLC, URI));

                }
            }

        }

        private  void Button_click(object sender, RoutedEventArgs e)
        {
            count++;
            this.Dispatcher.Invoke((Action)(() =>
            {
               countTBox.Text = count.ToString();
            }));
            Main_List();
        }

        private async void Video_Ended(object sender, EventArgs e)
        {
            //ThreadPool.QueueUserWorkItem(_ => media_player.Stop());//doesn't work
            await Task.Run(() => media_player.Stop());
            Web_flag = false;
            //Button_click(this, null);//Works fine when commented out and the "Press to view video" button is clicked each time. Not so much when looping.
        }

        private void Main_List()
        {
            if (count%2 == 0)//even
            {
                Media_play("C:\\Users\\echo_\\Downloads\\videoplayback (1).mp4");             
            }
            else//odd
            {
                Web_flag = true;    
                Media_play("https://youtu.be/UK4t59mhIhs");
            }
        }

        private void VLC_player_Loaded(object sender, RoutedEventArgs e)
        {
            init_flag = true;
            Core.Initialize();
        }

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-17 05:45:33

不要试图在VideoEnded事件时调用Stop,我认为在libvlc3中有一个已知的问题会导致程序挂起。改为使用新媒体调用.Play。

此外,如果可以避免的话,我不建议使用两个不同的libvlc实例。1个LibVlc和1个媒体播放器,但在同一个MediaPlayer上使用多个Play()将是常态。如果您需要不同的选项,您可以将不同的选项作为媒体选项传递(尽管有些选项在媒体级别不可用,比如详细选项(在这种情况下,我会注册一个日志回调并在那里进行过滤)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67130988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档