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.mp4
或http://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播放器直接馈送媒体