Vlc.Dotnet在WPF上播放流式h264原始数据



all。我是一个编程初学者,在视频解码/播放方面遇到了一些困难。

我有来自tcpsocket的原始h264数据流,我想在WPFusercontrol上显示视频。

由于我对C++知识不多;视频解码/编码,对我来说很难使用ffmpeg。所以我正在考虑VLC是否能做到这一点。

背景是:我想使用Scrcpy服务器构建我自己的"安卓屏幕投射&远程控制";WPF应用程序。

到目前为止,我已经实现了:

  • 将服务器推送到设备并启动服务器
  • 在PC和Android设备之间建立TCP连接
  • 可以在套接字中看到h264原始数据流

然后下一步是:在WPFusercontrol上显示视频

事实上,我以前尝试过另一种解决方案,可以得到我想要的

  • 将MPV用作媒体播放器
  • 在我的应用程序中使用特定参数启动mpv.exe进程
  • 在WPF主机元素中嵌入mpv窗口

但我认为<WindowsFormsHost/>不适合WPF应用程序,所以我正在尝试找到一种WPF风格的方法。

当我搜索Github时,我发现如果我想从光盘或互联网上播放媒体文件会更容易,我只需要传递文件位置(例如D:/MyFolder/mySampleVideo.mp4http://somesite/aSampleVideo.flv(,而不需要关心组件/元素的工作方式。像这个项目和这个项目

如果我使用VLC,如何直接播放原始h264数据流?有VlcPlayer.Play(NetworkStream myh264stram) {...}这样的方法吗?

但我认为这对于WPF应用程序来说并不完美,所以我正在努力寻找一种WPF风格的方法。

在WPF应用程序中使用WindowsFormsHost的解决方案是我们为WPF找到的最好的解决方案,因为实现真正的WPF解决方案并没有很好的性能:https://github.com/ZeBobo5/Vlc.DotNet#writing-a-wpf-app--从-2x 迁移-wpf-control

也就是说,如果你仍然想继续Vlc。DotNet(已处于维护模式(,您可能需要指定您希望libvlc在VlcMediaPlayerOptions中与"--demux", "h264"一起使用的demux

那么,你真的可以打电话给

mediaPlayer.Play(stream);

使用LibVLCSharp,过程完全相同,但我们使用MediaInput类来保存对Stream的引用,请参阅:https://github.com/mfkl/lvst/blob/master/LVST/Program.cs#L72

using var mediaInput = new StreamMediaInput(stream);
using var media = new Media(libVLC, mediaInput);
using var mediaPlayer = new MediaPlayer(media);

另请参阅:C#LibVLCSharp播放器直接馈送媒体

最新更新