libVLCsharp.forms 无法播放 Android 资源视频文件,而 iOS 可以 [英] libVLCsharp.forms can not play Android resource video file while iOS can

查看:137
本文介绍了libVLCsharp.forms 无法播放 Android 资源视频文件,而 iOS 可以的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试在 xamarinForms 项目中使用 libvlcsharp.forms.
需要播放资源视频文件.

Trying to use libvlcsharp.forms in xamarinForms project.
Need to play resource video files.

安装 libVLCsharp.Forms、VideoLan.LibVLC.Android、VideoLan.LibVLC.IOS

Installed libVLCsharp.Forms, VideoLan.LibVLC.Android, VideoLan.LibVLC.IOS

复制一个mp4文件到iosProject/Resources;标记为 BundleResource.
将相同的文件复制到 androidProject/Resources/raw;标记为 AndroidResource

Copied an mp4 file to iosProject/Resources; marked as BundleResource.
Copied same file to androidProject/Resources/raw; marked as AndroidResource

  • iOS 可以通过互联网播放
  • Anroid 可以播放与 iOS 相同的在线地址
  • ios可以播放资源文件
  • android 无法播放相同的资源文件

错误 > 媒体文件错误:////BigBuckBunny.mp4

Error > error with media file:////BigBuckBunny.mp4

认为它不喜欢我的 mp4 文件格式或类似的格式.
从url下载可以播放的文件.
尝试了那个.
相同的结果.

Thought it did not like my mp4 file format or something like that.
downloaded the file which it could play from url.
tried that one instead.
same results.

帮助!!!

虽然它(android)可以从 url 播放著名的 BigBuckBuny > http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4,它无法播放下载并复制到 AndroidProject/Resource/raw 的相同视频

While it(android) could play famous BigBuckBuny from url > http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4, it can not play same video downloaded and copied to AndroidProject/Resource/raw

XAML 部分:

<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ParkinsonMobileApp.Pages.PhysicalActivitiesVideoDetail"
Padding="0"
Title="HomePage"
FlowDirection="LeftToRight"
xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
ios:Page.UseSafeArea="False"
NavigationPage.HasNavigationBar="False"
xmlns:customViews="clr-namespace:ParkinsonMobileApp.Views"
BackgroundColor="White"
xmlns:vlc="clr-namespace:LibVLCSharp.Forms.Shared;assembly=LibVLCSharp.Forms"
Appearing="ContentPage_OnAppearing"
Disappearing="ContentPage_Disappearing">
<AbsoluteLayout
    Padding="0"
    Margin="0"
    HorizontalOptions="Fill"
    VerticalOptions="Fill">
    <Image
        x:Name="imgViewBackground"
        Source="viewBackgroundBlurred.png"
        Aspect="AspectFill"
        AbsoluteLayout.LayoutFlags="All"
        AbsoluteLayout.LayoutBounds="0,0,1,1" />
    <vlc:MediaPlayerElement
        x:Name="vlcPlayer"
        MediaPlayer="{Binding MediaPlayer}"
        LibVLC="{Binding LibVLC}"
        EnableRendererDiscovery="True"
        Padding="0"
        Margin="0"
        AbsoluteLayout.LayoutFlags="All"
        AbsoluteLayout.LayoutBounds="0,0,1,1" />
    <customViews:CustomNavigationBar
        HorizontalOptions="Fill"
        VerticalOptions="Start"
        Padding="0"
        Margin="0"
        AbsoluteLayout.LayoutFlags="All"
        AbsoluteLayout.LayoutBounds="0,0,1,1"
        Theme="White"
        ImgBackgroundIsVisible="False"
        ButBackDisplayed="True"
        ButsOnRightDisplayed="False"
        TitleText="Egzersiz 001"
        TitleIsDisplayed="True"
        BackgroundColor="Transparent"
        backClicked="CustomNavigationBar_backClicked" />
</AbsoluteLayout>

代码隐藏数据绑定:

void ContentPage_OnAppearing(object sender, System.EventArgs e)
    {
        base.OnAppearing();
        //pageViewModel = new VieoDetailViewModel("file://android_asset/024_1.mp4");
        //pageViewModel = new VieoDetailViewModel("024_1.mp4");
        pageViewModel = new VieoDetailViewModel("BigBuckBunny.mp4");
        BindingContext = pageViewModel;
        //MessagingCenter.Send(this, "AllowLandscape");
    }

数据绑定模型:

public class VieoDetailViewModel : ViewModelBase
{
    /// <summary>
    /// Initialize LibVLC and playback when page appears
    /// </summary>
    public VieoDetailViewModel(String filePath)
    {
        Core.Initialize();

        LibVLC = new LibVLC();

        var media = new Media(LibVLC,
            //"http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
            filePath,
            //FromType.FromLocation
            FromType.FromPath
            );

        MediaPlayer = new MediaPlayer(media) { EnableHardwareDecoding = true };
        //MediaPlayer = new MediaPlayer(media);
        MediaPlayer.Play(media);
    }

    /// <summary>
    /// Gets the <see cref="LibVLCSharp.Shared.LibVLC"/> instance.
    /// </summary>
    public LibVLC _LibVLC;
    public LibVLC LibVLC
    {
        get
        {
            return _LibVLC;
        }
        set
        {
            _LibVLC = value;
            OnPropertyChanged("LibVLC");
        }
    }

    /// <summary>
    /// Gets the <see cref="LibVLCSharp.Shared.MediaPlayer"/> instance.
    /// </summary>
    public MediaPlayer _MediaPlayer;
    public MediaPlayer MediaPlayer
    {
        get
        {
            return _MediaPlayer;
        }
        set
        {
            _MediaPlayer = value;
            OnPropertyChanged("MediaPlayer");
        }
    }
}

推荐答案

Media 构造函数有一个重载,它接受 StreamMediaInput,因此您可以将视频文件作为嵌入资源添加到主项目中,将其读入 Stream 并创建来自它的 StreamMediaInput.如果你这样做,它也适用于 iOS,所以你只需要主项目中的视频文件,从 Android 和 iOS 中删除它们.

The Media constructor has an overload that takes a StreamMediaInput so you can add the video file to the main project as an embedded resource, read it into a Stream and create the StreamMediaInput from it. If you do it this way it will work for iOS as well so you only need the video files in the main project, remove them from Android and iOS.

using System.IO;
using System.Reflection;
...

Assembly assembly = Assembly.GetExecutingAssembly();
string assemblyName = assembly.GetName().Name;
Stream stream = assembly.GetManifestResourceStream(assemblyName + ".BigBuckBunny.mp4");
StreamMediaInput mediaStream = new StreamMediaInput(stream);
Media media = new Media(_libVLC, mediaStream, new string[] { });
MediaPlayer player = new MediaPlayer(media) { EnableHardwareDecoding = true };
player.Play();

这假设 mp4 文件位于主项目的根目录中.另请注意,我没有将 Stream 包装在 using() 中,因为您需要挂在它上面,直到完成视频并处理它,所以您需要解决它 - 您可以创建一个类来处理那个.

This assumes the mp4 file is in the root of the main project. Also note that I haven't wrapped the Stream in a using() because you need to hang onto it until you're done with the video and dispose of it then, so you need to sort that out - you could create a class to handle that.

这篇关于libVLCsharp.forms 无法播放 Android 资源视频文件,而 iOS 可以的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆