簡體   English   中英

如何使用 LibVlcSharp 在 vi​​deoView 中刪除視頻黑帶?

[英]How to remove video black bands in videoView with LibVlcSharp?

當我播放帶有視頻的視頻時,它會在視頻的頂部和底部顯示黑色條紋,就像 URL https://imgur.com/a/JiUv8rt中的圖像一樣。 我想刪除樂隊並以絕對布局僅顯示視頻。 我怎樣才能達到我的目標?

<pages:PopupPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:pages="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             xmlns:animations="clr-namespace:Rg.Plugins.Popup.Animations;assembly=Rg.Plugins.Popup"
             xmlns:shared="clr-namespace:LibVLCSharp.Forms.Shared;assembly=LibVLCSharp.Forms"
             x:Class="App.Pages.WebcamVideoPopUpPage"
             BackgroundColor="Transparent">
    <pages:PopupPage.Animation>
        <animations:ScaleAnimation 
            PositionIn="Center"
            PositionOut="Center"
            ScaleIn="1.2"
            ScaleOut="0.8"
            DurationIn="400"
            DurationOut="300"
            EasingIn="SinOut"
            EasingOut="SinIn"
            HasBackgroundAnimation="True"/>
    </pages:PopupPage.Animation>

    <AbsoluteLayout x:Name="AbsoluteLayoutWebcam"
                    HorizontalOptions="FillAndExpand"
                    VerticalOptions="FillAndExpand">


        <shared:VideoView x:Name="VideoViewWebcam"
                          AbsoluteLayout.LayoutFlags="All"
                          AbsoluteLayout.LayoutBounds="0, 0, 1, 1"
                          MediaPlayer ="{Binding MediaPlayer}"
                          MediaPlayerChanged ="VideoView_MediaPlayerChanged"/>

        <Label x:Name="DescriptionWebcam"
               AbsoluteLayout.LayoutFlags="All" 
               AbsoluteLayout.LayoutBounds="0, 0, 1, .2"
               HorizontalOptions="Fill" 
               VerticalOptions="Fill" 
               Text="{Binding InfoWebcam}"
               FontSize="Large"
               TextColor="White"/>

    </AbsoluteLayout>
</pages:PopupPage>

更新我按照@mtz 的建議在最新的預發布版本中進行更新,並按以下方式修改了我的代碼:

public partial class WebcamVideoPopUpPage : PopupPage
{
    public WebcamVideoPopUpPage()
    {
        var vm = App.Locator.WebCamVideoVM;
        this.BindingContext = vm;
        InitializeComponent();
        MediaPlayerWebcam.VideoView.MediaPlayerChanged += VideoView_MediaPlayerChanged;
        MediaPlayerWebcam.MediaPlayer.AspectRatio = "FitScreen";
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        Messenger.Default.Send(new OnApperingVideoMessage());
    }

    private void VideoView_MediaPlayerChanged(object sender, LibVLCSharp.Shared.MediaPlayerChangedEventArgs e)
    {
        Messenger.Default.Send(new OnVideoViewInitializedMessage());
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        MediaPlayerWebcam.MediaPlayer.Stop();
        MediaPlayerWebcam.MediaPlayer = null;

    }

}

我的xml:

<AbsoluteLayout x:Name="AbsoluteLayoutWebcam"
                HorizontalOptions="FillAndExpand"
                VerticalOptions="FillAndExpand">


    <shared:MediaPlayerElement x:Name="MediaPlayerWebcam"
                      AbsoluteLayout.LayoutFlags="All"
                      AbsoluteLayout.LayoutBounds="0, 0, 1, .4"
                      MediaPlayer ="{Binding MediaPlayer}"/>

    <Label x:Name="DescriptionWebcam"
           AbsoluteLayout.LayoutFlags="All" 
           AbsoluteLayout.LayoutBounds="0, 0, 1, .2"
           HorizontalOptions="Fill" 
           VerticalOptions="Fill" 
           Text="{Binding InfoWebcam}"
           FontSize="Large"
           TextColor="White"/>

</AbsoluteLayout>

我的視圖模型:

public class WebcamVideoViewModel : BaseViewModel
{
    private LibVLC LibVLC { get; set; }

    private bool IsLoaded { get; set; }
    private bool IsVideoViewInitialized { get; set; }

    private Media Media { get; set; }

    private MediaPlayer _mediaPlayer;
    public MediaPlayer MediaPlayer
    {
        get { return _mediaPlayer; }
        set
        {
            _mediaPlayer = value;
            OnPropertyChanged();
        }
    }

    private string _InfoWebcam { get; set; }

    public string InfoWebcam
    {
        get { return _InfoWebcam; }

        set
        {
            _InfoWebcam = value;
            OnPropertyChanged();
        }
    }
    public WebcamVideoViewModel(INavigationService navigationService, IApiAutostradeManagerFactory apiAutostradeFactory) : base(navigationService, apiAutostradeFactory)
    {
        Messenger.Default.Register<InfoWebcamVideoMessage>(this, OnReceivedInfoWebcam);
        Messenger.Default.Register<OnApperingVideoMessage>(this, OnAppearing);
        Messenger.Default.Register<OnVideoViewInitializedMessage>(this, OnVideoViewInitialized);
        Task.Run(Initialize);
    }

    private void Initialize()
    {
        Core.Initialize();

        LibVLC = new LibVLC();
        MediaPlayer = new MediaPlayer(LibVLC);

    }

    private async void OnReceivedInfoWebcam(InfoWebcamVideoMessage msg)
    {
        var response = await ApiManager.GetVideoWebcam(msg.Mpr, msg.Uuid);
        if (response.IsSuccessStatusCode)
        {
            InfoWebcam = msg.T_Description_webcam;
            var stream = await response.Content.ReadAsStreamAsync();
            Media = new Media(LibVLC, stream);

            Play();
        }
    }

    public void OnAppearing(OnApperingVideoMessage msg)
    {
        IsLoaded = true;

    }

    public void OnVideoViewInitialized(OnVideoViewInitializedMessage msg)
    {
        IsVideoViewInitialized = true;
    }

    private void Play()
    {
        if (IsLoaded && IsVideoViewInitialized)
        {
            MediaPlayer.Play(Media);

        }
    }

}

現在我更接近解決方案了,因為 videoView 可以通過 bootm 上的按鈕調整大小,但我想開始填充 AspectRatio 並且我不想要任何除了視頻的東西(換句話說,我想要刪除搜索欄並調整視頻按鈕大小)。 另一個問題是,在我關閉 mediaPlayer 並再次打開一個新視頻后,我的應用程序崩潰了。 有什么建議嗎?

您需要更改縱橫比以“填充屏幕”。

在此處查看操作方法: https : //github.com/videolan/libvlcsharp/blob/91b8f06ee1bedd9b3219a4e9ade0a9c44f59fda8/LibVLCSharp.Forms/Shared/PlaybackControls.xaml.cs#L926或使用最新的預發布版 MediaFormsSharp 包,其中包含 LibElementlayerPLC。內置此功能(即將推出穩定版)。

你只是想拉伸視頻。 但請記住,它會影響視頻質量
為了保持簡單,您可以嘗試使用以下有效且經過測試的代碼:

MediaPlayerWebcam.MediaPlayer.AspectRatio = $"{MediaPlayerWebcam.Width.ToString()}:{MediaPlayerWebcam.Height.ToString()}";
MediaPlayerWebcam.Scale = 0;

我的場景是一個全屏播放器,我用這些代碼來做,參考 LibVLCSharp.Forms,希望它會有所幫助。 代碼處理全屏(評論)或用視頻填充屏幕。

    public void PlayerFullScreen()
    {
        //restore
        if (_isFullScreen)
        {
            RestoreDefaultWindowInfo();
            _isFullScreen = false;
            _mediaPlayer.Scale = _originalScale;   //reset 
            _mediaPlayer.AspectRatio = _originalAspectRatio;
            //Mouse.Capture(null);
            playerBar.Visibility = Visibility.Visible;
        }
        else  // fullscreen(stretch video)
        {
            this.WindowStyle = WindowStyle.None;
            this.ResizeMode = ResizeMode.NoResize;
            this.Left = 0;
            this.Top = 0;
            this.Width = SystemParameters.VirtualScreenWidth;
            this.Height = SystemParameters.VirtualScreenHeight;
            //this.Topmost = true;
            _isFullScreen = true;
            _originalScale = _mediaPlayer.Scale;   // save original
            _originalAspectRatio = _mediaPlayer.AspectRatio;

            playerBar.Visibility = Visibility.Collapsed;

            MediaTrack? mediaTrack;
            try
            {
                mediaTrack = _mediaPlayer.Media?.Tracks?.FirstOrDefault(x => x.TrackType == TrackType.Video);
            }
            catch (Exception)
            {
                mediaTrack = null;
            }
            if (mediaTrack == null || !mediaTrack.HasValue)
            {
                return;
            }

            //get windows scale factor(DPI)
            PresentationSource source = PresentationSource.FromVisual(this);
            double dpiX=1.0, dpiY=1.0;
            if (source != null)
            {
                dpiX = source.CompositionTarget.TransformToDevice.M11;
                dpiY = source.CompositionTarget.TransformToDevice.M22;
            }

            var displayW = this.Width * dpiX;
            var displayH = this.Height * dpiY;
            var videoSwapped = mediaTrack.Value.Data.Video.Orientation == VideoOrientation.LeftBottom ||
                                        mediaTrack.Value.Data.Video.Orientation == VideoOrientation.RightTop;

            var videoW = mediaTrack.Value.Data.Video.Width;
            var videoH = mediaTrack.Value.Data.Video.Height;

            if (videoSwapped)
            {
                var swap = videoW;
                videoW = videoH;
                videoH = swap;
            }
            if (mediaTrack.Value.Data.Video.SarNum != mediaTrack.Value.Data.Video.SarDen)
                videoW = videoW * mediaTrack.Value.Data.Video.SarNum / mediaTrack.Value.Data.Video.SarDen;

            var ar = videoW / (float)videoH;
            var dar = displayW / (float)displayH;

            float scale;
            if (dar >= ar)
                scale = (float)displayW / videoW; /* horizontal */
            else
                scale = (float)displayH / videoH; /* vertical */

            //keep ratio of width/height, not fill the srceen
            //_mediaPlayer.Scale = scale;         // 這是保持視頻寬高比的,視頻不會變形
            //_mediaPlayer.AspectRatio = string.Empty;//這是保持視頻寬高比的,視頻不會變形

            //這是視頻變形適配屏幕的情況(滿屏)
            //fill all the screen by video,video is streched 
            float xscale, yscale;
            xscale = (float)(displayW / videoW);
            yscale = (float)(displayH / videoH);
            _mediaPlayer.Scale = (xscale<yscale)? xscale:yscale;
            string aspectRatio = String.Format("{0}:{1}",
                    this.Width,this.Height);
            _mediaPlayer.AspectRatio = aspectRatio;

        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM