media-player - UNO 中对 Web Assembly 的媒体播放器支持
问题描述
我正在 UNO 上开发一个用于播放视频的 APP。它在除 WASM 之外的其他平台上运行良好。我检查了代码并意识到MediaPlayerElement
Web Assembly 没有实现。
目前是否有任何可用的解决方法,或者它是否正在进行中并将很快可用,或者我在这里遗漏了什么?
解决方案
要在 Uno Platform WebAssembly 应用程序上播放媒体,您可以查看Ch9 应用程序中的HtmlMediaPlayer
实现。完整代码如下。
有几点需要注意:
- 该
HtmlElement
属性告诉 Uno 创建一个<video/>
标签作为该控件的底层 DOM 元素 OnSourceChanged()
回调使用Uno的扩展方法将传递Source
给本机。<video/>
ExecuteJavascript()
[HtmlElement("video")]
public sealed partial class HtmlMediaPlayer : Border
{
public HtmlMediaPlayer()
{
Background = new SolidColorBrush(Colors.Transparent);
}
public static readonly DependencyProperty SourceProperty = DependencyProperty.Register(
"Source", typeof(string), typeof(HtmlMediaPlayer), new PropertyMetadata(default(string), OnSourceChanged));
public string Source
{
get => (string)GetValue(SourceProperty);
set => SetValue(SourceProperty, value);
}
private static async void OnSourceChanged(DependencyObject dependencyobject, DependencyPropertyChangedEventArgs args)
{
if (dependencyobject is HtmlMediaPlayer player)
{
var encodedSource = WebAssemblyRuntime.EscapeJs("" + args.NewValue);
var js = $"element.controls = true; element.src=\"{encodedSource}\";";
player.ExecuteJavascript(js);
}
}
}
您可以在第 9 章中看到如何将其用作以下内容的替代品MediaPlayerElement
:
<not_wasm:MediaPlayerElement x:Name="MediaPlayer"
Source="{Binding VideoSource}"
IsFullWindow="{Binding Parent.IsVideoFullWindow, Mode=TwoWay}"
Height="180" />
<wasm:Border>
<localwasm:HtmlMediaPlayer x:Name="MediaPlayer"
Height="180"
Source="{Binding VideoUri}" />
</wasm:Border>
MediaPlayerElement
将来可能会向 Uno 平台添加适当的支持,您可以通过支持问题来帮助优先考虑它。
推荐阅读
- ruby-on-rails - 只更新一个与 simple_fields_for 的关联
- c++ - Boost::Variant "Error: no match for call to [...]" 访问者操作符重载
- html - HTML:为什么文本比图像低一个段落?(附图片)
- python - 混合数值和分类数据的观测值之间成对距离计算的有效实现
- python - dateutil.parser - 用点分隔小时和分钟
- java - 如何根据孩子的值在 RecyclerView Android 上显示项目
- php - 在 MacOS 中升级到 PHP 7.2 版本
- python - 打印列表中具有与列表平均值相同的平均值的元素对
- typescript - Vue / Typescript,得到模块'“*.vue”'没有导出成员
- vb.net - 如何在 vb.net 中使用数组来使用组合框