基于.Net 的 AvaloniUI 多媒体播放器方案汇总

摘要

随着国产化的推进,相信.Net的桌面端的小伙伴的可能已经有感受到了。 为了让.Net的桌面框架能够跨桌面平台,首选的就是Avalona-UI。

为了让AvaloniaUI能够跨多个平台播放视频,这里测试主要播放视频形式是使用RTSP。 所以,在这篇博文中,我打算对目前的Avalonia-UI框架上播放RTSP的方式,对现有的开源解决方案进行汇总。

如果文章有哪些问题,希望大佬们能不吝指出,或者共同交流下。

本篇文章将随时更新,欢迎有兴趣的小伙伴可以随手订阅或者转载,并注明出处。

正文

1. LibSharpLVC (播放RTSP,当然首选的是VLC播放器。)

LibSharpVLC.Avalona 官方支持在播放Window,Linux,MacOS(未测试), 但是我目前仅仅在Window和Linux进行测试过了。

使用LibSharpVLC有几个优缺点:

  • 优点

    • 通用,使用广泛(坑基本都被人踩完了)
    • 跨平台 (Window,Linux,MacOS)
    • 支持广泛视频编解码
  • 缺点

    • 仅能通过句柄播放, 在LibSharpVLC中,基于Avalonia封装的VideoView基于NativeControlHost的,这里会产生与WPF一样的空域问题。
    • 通过Overlap Window方式解决Air issue后,在Linux环境表现不一致。
      1. 当拖动超过屏幕范围后Overlayer窗口无法跟随拖动到屏幕范围外。

        通过调试Avalonia源代码,发现似乎是LinuxX11的通病,似乎是可以使用override_redirect来重写一些默认X11的操作,但是这也影响了窗体的其他渲染问题(如:需要自行实现某些渲染效果,未测试)。

      2. Overlayer窗口会掉到Owner之后。 (注: 原来使用11.0.2测试,更新AvaloniaUI >= 11.0.4 即可解决)

      3. 在移动端无法使用此方案。

2. 基于AvaloniUI创建MediaPlayer, 根据系统平台集成相应的媒体播放器

此方案是考虑不同系统使用不同的媒体播放器,包括第三方的播放器, 如 AndroidExoPlayer或者IjkPlayer等。。

个人认为可以考虑下面的方案,有兴趣的小伙伴可以一起交流下, 即:

  • Window -> NativeControlHost+Overlap Window
  • Linux -> MPV with OpenGL
  • Android -> MPV with OpenGL or ExoPlayer or IjkPlayer
  • MacOS -> 目前未测试不了解, 理论上支持MPV
  • IOS -> 目前未测试不了解, 理论上支持MPV

注: 此种方案可以实现不同的系统上采用最适合的播放器,并且定制性很高,但是也是最复杂的方式,需要考虑以下几点:

  • 不同系统平台的编解码器不尽相同 (不同播放源统一, 需要考虑备用播放方式)
  • 相同系统平台在某些设备上不支持某些播放器特性(如硬件加速等。。) 需要为播放器支持降级
  • 嵌入第三方播放器或者NativeControlHost, 在上层的控件无法使用原生AvaloniaUI控件的情况
  • 不同系统平台之间可能并不一定需要采用 Overlap Window方案

3. MPV 播放器

MPV是一个基于MIT协议的免费,开源,跨平台的媒体播放器,并支持GPU视频编解码,高质量的视频输出,支持基于OpenGL,Valkan,D3D11的视频输出等。。

使用基于.Net包装的Mpv播放器库,并支持运行Window, Linux, Android, MacOS(未测试,理论支持), Ios(未测试,理论支持), 原生支持在播放器之上叠加控件(基于喂ImageSource方式)

在这里测试了 LibMpv播放库, 在Sample中,已经加入了Avalonia的例子。并支持OpenGL,NativeControlHost,Software三种方式渲染,用于兼容不同系统平台. 基于应用上的考虑,我个人觉得在MPV之上再进行封装,当程序跑在Window基于NativeControlHost来实现更好的效果。

注: Ubuntu下测试需要安装 sudo apt install libmpv-dev libmpv2.

以下分别为运行在Linux Window Android 下的显示效果

参考文献

Video Player in Avalonia Discussions

MediaPlayerUI

LibMpv(基于.Net的MPV封装

Mpv.Net-Lib (基于.Net的MPV封装)

Awesome MPV

Mpv Manual

Mpv Official Website

Mpv

XLib Tutorial

X11 XMoveWindow

===

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 0xJins包含此链接),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

基于.Net 的 AvaloniUI 多媒体播放器方案汇总的更多相关文章

  1. 基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)

    一.前言 回顾:基于.NetCore3.1系列 -- 认证授权方案之授权揭秘 (上篇) 在上一篇中,主要讲解了授权在配置方面的源码,从添加授权配置开始,我们引入了需要的授权配置选项,而不同的授权要求构 ...

  2. 基于FFMPEG的跨平台播放器实现

    基于FFMPEG的跨平台播放器实现 一.背景介绍 FFmpeg是一款超级强大的开源多媒体编解码框架,提供了录制.转换以及流化音视频的完整解决方案,包含了libavcodec.libavformat等多 ...

  3. jQuery多媒体播放器插件jQuery Media Plugin使用方法

    jQuery Media Plugin是一款基于jQuery的网页媒体播放器插件,它支持大部分的网络多媒体播放器和多媒体格式,比如:Flash, Windows Media Player, Real ...

  4. 基于JWT的token身份认证方案

    一.使用JSON Web Token的好处? 1.性能问题. JWT方式将用户状态分散到了客户端中,相比于session,可以明显减轻服务端的内存压力. Session方式存储用户id的最大弊病在于S ...

  5. 最好的 6 个 HTML5 的多媒体播放器

      是 HTML5 中新引入的标签,用来在 Web 网页中嵌入视频播放功能,无需 Flash 和其他嵌入式插件的支持,是浏览器内建的功能,不过  旨在一些高级浏览器中支持,例如 Firefox, Sa ...

  6. Freemaker基于word模板动态导出压缩文件汇总整理

    Freemaker基于word模板动态导出压缩文件汇总整理 Freemaker基于word模板动态导出单个文件思路和代码详情见连接: https://www.cnblogs.com/lsy-blogs ...

  7. SpringBoot | 第三十八章:基于RabbitMQ实现消息延迟队列方案

    前言 前段时间在编写通用的消息通知服务时,由于需要实现类似通知失败时,需要延后几分钟再次进行发送,进行多次尝试后,进入定时发送机制.此机制,在原先对接银联支付时,银联的异步通知也是类似的,在第一次通知 ...

  8. 基于JWT的token身份认证方案(转)

    https://www.cnblogs.com/xiangkejin/archive/2018/05/08/9011119.html 一.使用JSON Web Token的好处? 1.性能问题. JW ...

  9. 基于.NetCore3.1系列 ——认证授权方案之Swagger加锁

    一.前言 在之前的使用Swagger做Api文档中,我们已经使用Swagger进行开发接口文档,以及更加方便的使用.这一转换,让更多的接口可以以通俗易懂的方式展现给开发人员.而在后续的内容中,为了对a ...

  10. TopoLVM: 基于LVM的Kubernetes本地持久化方案,容量感知,动态创建PV,轻松使用本地磁盘

    正文 研发测试场景下,一般追求的是一键快速起环境,横向动态复制,一人一套,随起随用,用完即走.作为使用方,其不用关心实际的物理资源是怎样的,环境起在哪里,只要声明自己的使用需求即可.但作为方案构建者以 ...

随机推荐

  1. React SSG - 也写个 Demo 吧

    上次写了一个 SSR 的 DEMO,今天写个小 Demo 来从头实现一下 react 的 SSG,来理解下 SSG 是如何实现的. 什么是 SSG SSG 即 Static Site Generati ...

  2. 从2PC和容错共识算法讨论zookeeper中的Create请求

    最近在读<数据密集型应用系统设计>,其中谈到了zookeeper对容错共识算法的应用.这让我想到之前参考的zookeeper学习资料中,误将容错共识算法写成了2PC(两阶段提交协议),所以 ...

  3. 企业级GitLab搭建

    企业级GitLab搭建 一.简介 1.GitLab概述 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目. Rub ...

  4. JavaCV的摄像头实战之十三:年龄检测

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<JavaCV的摄像头实战> ...

  5. 报错 no currentsessioncontext configured!

    no currentsessioncontext configured! 使用hibernate框架报错 配置了session工厂类,使用getCurrentSession();时候引起的,原因是cu ...

  6. Hexo博客yilia主题添加背景音乐 (网易云音乐)

    1. 打开网易云音乐首页,然后搜索你要添加的背景音乐 http://music.163.com/ 2. 搜索到歌曲点击生成外链播放器,进去下一个界面 3. 复制外链播放器的代码 打开yilia主题下的 ...

  7. 普通用户启动 supervisor 报 HTTP 错误(strace)

    公司的开发对生产环境都有普通用户 www 的权限,采用堡垒机登录到生产环境的机器. 默认 supervisor 使用 root 用户启动,开发没有权限直接修改配置和操作 supervisor 管理的进 ...

  8. Redis核心技术与实践 01 | 基本架构:一个键值数据库包含什么?

    原文地址:https://time.geekbang.org/column/article/268262 个人博客地址:http://njpkhuan.cn/archives/redis-he-xin ...

  9. PDF转换OFD(Java实用版)

    前言: 在项目中用到了,就写一下哈 OFD简介 百度百科:https://baike.baidu.com/item/OFD/56227163?fr=aladdin OFD(Open Fixed-lay ...

  10. mysql系列03---事务

    一.事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销 操作请求,即这些操作要么同时成功,要么同时失败. 二.事物的四大特性 一个事务具有A ...