【问题标题】:Xamarin video player component stretch videos on AndroidXamarin 视频播放器组件在 Android 上拉伸视频
【发布时间】:2017-07-27 04:42:24
【问题描述】:

我有一个 Xamarin 表单项目,我需要在网格内显示视频,所以我购买了这个视频播放器组件:Octane VideoPlayer

它在 IOS 上运行良好,但在 android 中它不尊重纵横比,很多视频都被拉伸了。

我为此视频播放器尝试了自定义渲染,但没有任何变化,当我设置断点时,我发现渲染代码永远不会到达。

我错过了什么吗?

示例

cs:

   public partial class VideoPlayer : ContentPage
{
    public VideoPlayerPage()
    {

        InitializeComponent();
        VideoPlayer.Source = "16/9_video.mp4";
    }
}

自定义渲染:

[assembly: ExportRenderer(typeof(Octane.Xam.VideoPlayer.VideoPlayer), typeof(Assayil.Droid.VideoPlayerExtRenderer))]

**

public  class VideoPlayerExtRenderer : VideoPlayerRenderer
{

    protected override void OnElementChanged(ElementChangedEventArgs<VideoPlayer> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            Control.Started += (s2, e2) =>
            {
                UpdateVideoSize();
                Control.Player.VideoSizeChanged += (s3, e3) => UpdateVideoSize();
            };
        }
    }

    protected override void OnLayout(bool changed, int l, int t, int r, int b)
    {
        base.OnLayout(changed, l, t, r, b);

        UpdateVideoSize();
    }

    private void UpdateVideoSize()
    {
        if (Element.FillMode == FillMode.Resize)
        {
            Control.Layout(0, 0, Width, Height);
            return;
        }

        // assume video size = view size if the player has not been loaded yet
        var videoWidth = Control.Player?.VideoWidth ?? Width;
        var videoHeight = Control.Player?.VideoHeight ?? Height;

        var scaleWidth = (double)Width / (double)videoWidth;
        var scaleHeight = (double)Height / (double)videoHeight;

        double scale;
        switch (Element.FillMode)
        {
            case FillMode.ResizeAspect:
                scale = Math.Min(scaleWidth, scaleHeight);
                break;
            case FillMode.ResizeAspectFill:
                scale = Math.Max(scaleWidth, scaleHeight);
                break;
            default:
                // should not happen
                scale = 1;
                break;
        }

        var scaledWidth = (int)Math.Round(videoWidth * scale);
        var scaledHeight = (int)Math.Round(videoHeight * scale);

        // center the video
        var l = (Width - scaledWidth) / 2;
        var t = (Height - scaledHeight) / 2;
        var r = l + scaledWidth;
        var b = t + scaledHeight;
        Control.Layout(l, t, r, b);
    }
}

【问题讨论】:

  • 如果你买了建议联系卖家
  • 我遇到了同样的问题。甚至示例应用程序项目“ChillPlayer”也无法在 Android 设备上运行,因为它会以错误的纵横比拉伸视频。真的很伤心。

标签: android xamarin xamarin.forms video-player custom-renderer


【解决方案1】:

将 VideoPlayer 放置在 Frame 中,然后将其放置在 StackLayout 中,为 VerticalOptions 设置为 CenterAndExpand 应该可以解决问题。完美适用于 Android,尽管您可能希望使其依赖于平台,它将在 iOS 中以容器大小播放(视频看起来不错,但如果没有此修复,控制器看起来会更好)。

【讨论】:

  • 我不需要把它放在 Frame 中,一个带有 VerticalOptions 的 StackLayout 就足够了。谢谢。
  • 但纵横比仍然不准确。它有点偏离。客户拒绝了!
【解决方案2】:

我是组件的作者。这是一个众所周知的问题,我花了相当多的时间试图纠正它,但不幸的是我还没有找到一个稳定的解决方案。最常见的建议来自一个博客,该博客建议将 VideoView 包装在 RelativeLayout 中,如下所示,但这样做在我的测试期间没有任何改进。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <VideoView android:id="@+id/videoViewRelative"
         android:layout_alignParentTop="true"
         android:layout_alignParentBottom="true"
         android:layout_alignParentLeft="true"
         android:layout_alignParentRight="true"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent">
    </VideoView>

</RelativeLayout>

来源:http://blog.kasenlam.com/2012/02/android-how-to-stretch-video-to-fill.html

您在上面粘贴的代码是一种解决方法,对某些人来说效果很好,但我的测试再次表明它不够稳定,无法包含在内。一旦我能找到一个合适的解决方案,我一定会把它推给所有用户。

【讨论】:

  • 这对使用视频播放器的我们来说是一个严重的问题。请解决此问题或提供退款
猜你喜欢
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2016-12-31
  • 1970-01-01
  • 2021-02-04
  • 2011-10-01
  • 2017-12-15
相关资源
最近更新 更多