基于.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. C++面试八股文:std::vector和std::list,如何选择?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第24面: 面试官:list用过吗? 二师兄:嗯,用过. 面试官:请讲一下list的实现原理. 二师兄:std::list被称为双向链表,和C中手写双 ...

  2. 固定型思维 VS 成长型思维

    回顾进入职场工作以来,对比曾经的学生时代,如果让我讲一个对自己影响最大的改变,那就是思维模式的一个转变. 具体来说,就是从一个典型的固定型思维转变成一个具备有成长型思维的人. 当然,我不敢妄称自己已经 ...

  3. 体细胞突变检测分析流程-系列1( WES&Panel)

    Sentieon●体细胞变异检测-系列1   Sentieon 致力于解决生物信息数据分析中的速度与准确度瓶颈,通过算法的深度优化和企业级的软件工程,大幅度提升NGS数据处理的效率.准确度和可靠性. ...

  4. SpringIoc容器之Aware

    1 前言 Aware是Spring提供的一个标记超接口,指示bean有资格通过回调样式的方法由Spring容器通知特定的框架对象,以获取到容器中特有对象的实例的方法之一.实际的方法签名由各个子接口确定 ...

  5. 【小小demo】SpringBoot+Layui登录

    easy-login 基于layui 注册.登录简单实现,并他通过拦截器拦截未登录请求. 项目地址文章末尾 登录拦截器 SystemInterceptor preHandle在 Controller ...

  6. 详解RISC v中断

    声明 本文为本人原创,未经许可严禁转载.部分图源自网络,如有侵权,联系删除. RISC-V 中断与异常 trap(陷阱)可以分为异常与中断.在 RISC v 下,中断有三种来源:software in ...

  7. 【Kubernetes】yaml文件编写 -- 持续更新

    K8S通过yaml格式的声明式API与资源对象交互 API版本由apiVersion字段指定,API对象类型由kind字段指定 除此之外,每个API对象有三大类属性: metadata:元数据 spe ...

  8. 2023年郑州轻工业大学校赛邀请赛zzh

    第一次参加线下赛体验很好,面包和酸奶很好吃.ABL三题难度超出我们的能力范围,没能写出来,C题在读完题后,我们三个简单交流了一下,确定思路后我写的代码,一次AC,很顺利.D题简单的01背包,但我在写代 ...

  9. <学习笔记> 关于错排列

    1 是做排列计数的时候了解到这个东西: 一开始想的是用容斥原理,先加上全排列,再减去不满足的,再加上重复的,再减去不满足的...... 后来发现还涉及到杨辉三角,麻烦死了,时空复杂度也过不去,然后就知 ...

  10. Python Web:Django、Flask和FastAPI框架对比

    Django.Flask和FastAPI是Python Web框架中的三个主要代表.这些框架都有着各自的优点和缺点,适合不同类型和规模的应用程序. Django: Django是一个全功能的Web框架 ...