Xamarin表单视频播放器示例-获取用于上载的视频字节

Xamarin表单视频播放器示例-获取用于上载的视频字节,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在Xamarin表单应用程序中实现一个视频播放器,就像Xamarin提供的视频播放器示例一样 我可以从手机多媒体资料中选择视频,将视频播放器源设置为所选视频,然后播放视频。如何获取所选视频的实际流或字节,以便将其上载到Blob存储 我试过了 使用(FileStream fs=newfilestream(fileName,FileMode.Open,FileAccess.Read)) 其中fileName是设置为视频播放器源的选定视频的路径和文件名。它不工作,因为找不到Android文件名字

我正在Xamarin表单应用程序中实现一个视频播放器,就像Xamarin提供的视频播放器示例一样

我可以从手机多媒体资料中选择视频,将视频播放器源设置为所选视频,然后播放视频。如何获取所选视频的实际流或字节,以便将其上载到Blob存储

我试过了

使用(FileStream fs=newfilestream(fileName,FileMode.Open,FileAccess.Read))

其中fileName是设置为视频播放器源的选定视频的路径和文件名。它不工作,因为找不到Android文件名字符串。(从xamarin表单调用时)。我意识到即使在iOS上,文件名也会有所不同。我如何深入到特定于平台的实现中,并获取所选文件的文件字节或流? 谢谢

我将查看为libVLC提供跨平台.NET/Mono绑定的库。它们为Xamarin.Forms和实现流处理功能最可能需要的特性提供了良好的支持。你想要实现的目标并不简单,但应该是完全可行的

首先,您应该查看以下文档:

Stream output是VLC功能的名称,它允许将VLC读取的任何流输出到文件或作为网络流,而不是显示它

相关教程:

这应该让你开始,但肯定会有很多警告。例如,如果您试图在捕获要上传到某处的字节的同时播放视频,则必须遵守非常紧凑的时间框架。如果处理流的时间过长,则会减慢播放速度,用户体验也会受到影响


编辑:您可以研究的另一个选项是直接与libVLC的MediaPlayer类交互,如中所述。示例代码是C++,但是方法名称在.NET绑定中非常相似。 例如,以下代码段:

libvlc_video_set_callbacks(mplayer,
                           lock_frame, unlock_frame,
                           0, user_data);

可以通过调用绑定库中的
SetVideoCallbacks(libvlcvideockcb lockCb,LibVLCVideoLockCb unlockCb,LibVLCVideoLockCb displayCb)方法来使用libVLCSharp实现,如定义的那样。

您可以通过使用DependencyService非常简单地做到这一点。您需要调整以下代码以适应您正在使用的文件夹位置,但请执行此操作

将所有“测试”名称空间更改为您自己的项目

在共享项目中添加一个名为IFileSystem的界面,如下所示

using System;

namespace Test.Interfaces
{
    public interface IFileSystem
    {
        byte[] GetFileInBytes(string fileName);
    }
}
在每个平台项目中创建依赖项服务。为此,我只提供iOS和Android,但正如您所看到的,两者的逻辑基本上完全相同,只是名称空间不同

iOS

using System;
using System.IO;
using Test.Interfaces;
using Test.iOS.DependencyServices;
using Xamarin.Forms;

[assembly: Dependency(typeof(FileSystem))]
namespace Test.iOS.DependencyServices
{
    public class FileSystem : IFileSystem
    {
        public byte[] GetFileInBytes(string fileName)
        {
            var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos);
            fileName = Path.Combine(folder, fileName);
            return File.Exists(fileName) ? File.ReadAllBytes(fileName) : null;
        }
    }
}
Android

using System;
using System.IO;
using Test.Interfaces;
using Test.Droid.DependencyServices;
using Xamarin.Forms;

[assembly: Dependency(typeof(FileSystem))]
namespace Test.Droid.DependencyServices
{
    public class FileSystem : IFileSystem
    {
        public byte[] GetFileInBytes(string fileName)
        {
            var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos);
            fileName = Path.Combine(folder, fileName);
            return File.Exists(fileName) ? File.ReadAllBytes(fileName) : null;
        }
    }
}
。。。现在从共享项目中的任何位置调用它

var bytes = DependencyService.Get<IFileSystem>().GetFileInBytes("Test.mp4");
或者,更改该代码以满足您的需求。如果给定的文件路径包含完全限定的位置,则删除添加文件夹的逻辑


希望这对您有用。

您可能需要修改每个平台视频采集器的代码。我必须在接口中公开一个方法,并在每个平台上实现它。我想我是在寻找一个更容易的出路。我仍然需要在每个平台上找出如何获得ByTest谢谢你。如果我能花点时间,我会回到它,尽管我会尝试实现一些更简单的东西,如果我能改变的话,这种方法似乎是合乎逻辑的。但是,在Xamarin窗体视频播放器中,当您选择视频时,结果是一个URI。从URI获取实际路径似乎是不可能的content://com.android.providers.media.documents/document/video%3A1710Looks 像那样,URI将取决于用户实际从何处拾取视频?疯狂。谁会想到挑选和上传一个文件需要几个小时呢video@PatrickGoode看起来在堆栈上还有一些关于如何将内容uri转换为文件路径的其他示例。我建议寻找它,因为当你得到它的时候,你就可以把它作为一个字节数组。是的,我正在寻找它。谢谢
var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos);