【C#】VlcControl、libvlc使用汇总

一、VLC播放库简介

FFMPEG和VLC的关系:VLC调用了FFMPEG的库;
FFMPEG和libav的关系:libav是FFMPEG的开发人员中独立出来一部分后创建的一个新的工程。


VLC.DotNet类库:
(1)Vlc.DotNet.Forms :是包含winform界面控件的库,使用的时候需要加入到工具箱,在拖拽到界面;是对VLC.DotNet.Core的再次封装。
(2)Vlc.DotNet.Wpf : 包括wpf的,在hood方式下是使用WinForm控件;
(3)Vlc.DotNet.Core : 基础依赖包,如果是转换、编解码、做服务不需要界面的,可以考虑用这个来实现。
出处

二、环境配置

1、libvlc

下载VideoLAN.LibVLC.Windows.3.0.8.1可获取:

VLC官网下载vlc播放器安装包可达到同样的目的(在安装路径中获取)。

把这三个文件放到项目bin\Debug文件夹下。

 

附:

在NuGet管理器安装包失败的解决方法:https://www.cnblogs.com/Mars-0603/p/17119323.html

 

2、VlcControl

如果是使用VlcControl控件开发,除了VideoLAN.LibVLC.Windows.3.0.8.1的三个文件外,还需要:

Vlc.DotNet.Core.Interops.3.1.0:Vlc.DotNet.Core.Interops.dll

Vlc.DotNet.Core.3.1.0:Vlc.DotNet.Core.dll

Vlc.DotNet.Forms.3.1.0:Vlc.DotNet.Forms.dll(如果是WPF则下载Vlc.DotNet.WPF.3.1.0)

 

如果有现成的dll就不需要再在NuGet管理器下载包了,但这几个包的版本号一定要一致,否则添加控件会报错。

把这几个dll也放到项目bin\Debug文件夹下。

 

(1)如果是Winform,则在设计器工具箱右键点击“选择项...”,在“.NET FrameWork组件”选项卡中点击“浏览”,然后选择Vlc.DotNet.Forms.dll,就可以添加VlcControl控件了。

 

(2))如果是WPF,则添加命名空间:

xmlns:vlc="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"

引用控件:

<vlc:VlcControl x:Name="VlcControl1"/>

 

三、例程

1、C#编写的基于VLC的播放器(libvlc)

https://blog.csdn.net/u012342996/article/details/51271596

 

2、基于VLC库C#开发可播放摄像头及任意格式视频的播放器(WPF)

https://www.shuzhiduo.com/A/GBJr09wZd0/(源码我都有,评论留邮箱可发)

 

3、实现边播放RTSP流边保存为mp4(VlcControl

string SavePath = string.Format("{0}\\{1}.mp4", AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Video", DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));

//audio-desync音频不同步补偿
//network-caching 网络缓存 (ms) 
//rtsp-tcp 使用 RTP over RTSP (TCP)
//clock-synchro 时钟同步关闭
//live-caching直播捕获缓存 (ms) 
//file-caching文件缓存 (ms) 
//grayscale以黑白方式输出视频 (默认关闭) 
List<string>() options = new List<string>();
options.AddRange(new string[]{ 
                    ":audio-desync=0",
                    ":network-caching=300",
                    ":rtsp-tcp",
                    ":clock-synchro=0",
                    ":live-caching=0",
                    ":file-caching=0",
                    ":grayscale",
                    ":sout=#duplicate{dst=display, dst=standard{access=file,mux=flv,dst=\"" + SavePath + "\"}}"//关键语句
            }));

vlcControl1.ResetMedia();
vlcControl1.SetMedia(new Uri(filePath), options.ToArray());
vlcControl1.Play();

 

四、问题汇总

1、VlcControl回放视频文件时截图不成功

调用vlcControl1.TakeSnapshot(Path);一直返回false,后来发现是vlcControl1.SetMedia(new Uri(filePath), options);时options参数配置影响的。

我是在别人例程的基础上改的代码,原来的配置是:

            options = new[]
                    {
                        ":sout=#duplicate{dst=display,dst=std{access=file,mux="+ed+",dst="+dest+"}}",
                        ":sout-keep",
                        ":sout-all",
                        ":sout-audio",
                        ":sout-audio-sync", 
                    };

其中

":sout=#duplicate{dst=display,dst=std{access=file,mux="+ed+",dst="+dest+"}}"

意思是VLC播放视频的同时,将视频保存为dest指定的文件。把这一句注释掉以后就可以保存截图了。

duplicate模块功能简介:https://blog.csdn.net/u012459903/article/details/89402843

其他的options参数含义见:https://blog.csdn.net/csdn_zxw/article/details/114264625

https://blog.csdn.net/ufocode/article/details/49823151

 

2、libvlc.dll实现暂停后再播放,画面花屏

找遍全网也没找到这个解决办法。后面换成直接用VlcControl控件来开发,发现没有这个问题,而且各功能实现也更简单。

posted @ 2023-02-17 13:24  不溯流光  阅读(2328)  评论(2编辑  收藏  举报