【LibVLCSharp、WPF】播放udp视频流

一、在VLC中开启推送UDP流

 

 

 

 

2022-04-28补充:这里可能与激活转码无关, 注意看一下任务栏图标,是不是打开了多个vlc media player

 

 

 

 

 

 

 

 

 

 

 

 

再打开一个VLC测试一下:

 

 

 

 

 

 

注意:测试可以正常接收到UDP流之后要把上面这步打开的VLC关闭或停止播放,否则在下面的代码中无法播放(原因暂时没搞清楚,被坑了好久)

XAML

复制代码
<Window x:Class="Test.Vlc.Udp.MainWindow"
        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:local="clr-namespace:Test.Vlc.Udp"
        mc:Ignorable="d"
        xmlns:vlc="clr-namespace:LibVLCSharp.WPF;assembly=LibVLCSharp.WPF"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <vlc:VideoView Background="LightBlue" x:Name="VideoViewer"/>
        <WrapPanel Grid.Row="1" HorizontalAlignment="Center">
            <Button Height="30" Width="100"  x:Name="Play" Content="播放" Click="Play_Click"/>
            <Button Height="30" Width="100"  x:Name="Stop" Content="停止" Click="Stop_Click" Margin="30,0"/>
        </WrapPanel>
    </Grid>
</Window>
复制代码

CS

复制代码
using LibVLCSharp.Shared;
using System;
using System.Threading.Tasks;
using System.Windows;

namespace Test.Vlc.Udp
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Play_Click(object sender, RoutedEventArgs e)
        {
            await Task.Run(() =>
            {
                Core.Initialize();
                var _libvlc = new LibVLC();
                _libvlc.Log += _libvlc_Log;

                Application.Current.Dispatcher.Invoke(() => VideoViewer.MediaPlayer = new LibVLCSharp.Shared.MediaPlayer(_libvlc));

                var _media = new Media(_libvlc, "udp://@127.0.0.1:1234", FromType.FromLocation); //var _media = new Media(_libvlc, "udp://@localhost:1234", FromType.FromLocation);
                 //_media.AddOption(":access=udp");
                 //_media.AddOption(":demux=mp4v");

                 //var _media = new Media(_libvlc, "rtsp://localhost:8554/111", FromType.FromLocation);
                 //_media.AddOption(":access=rtsp-tcp");
                _media.AddOption(":clock-synchro=0");
                _media.AddOption(":live-caching=0");
                _media.AddOption(":network-caching=1000");
                _media.AddOption(":file-caching=0");
                _media.AddOption(":grayscale");
                Application.Current.Dispatcher.Invoke(() => VideoViewer.MediaPlayer.Play(_media));

            });
        }

        private void _libvlc_Log(object sender, LogEventArgs e)
        {
            Console.WriteLine(e.FormattedLog);
        }

        private void Stop_Click(object sender, RoutedEventArgs e)
        {
            VideoViewer.MediaPlayer?.Stop();
            VideoViewer.MediaPlayer?.Dispose();
        }
    }
}
复制代码

 

 

posted @   梦醒江南·Infinite  阅读(2163)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示