Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何将内存流加载到LibVLC中?_File_C# 4.0_Bytearray_Memorystream_Libvlc - Fatal编程技术网

File 如何将内存流加载到LibVLC中?

File 如何将内存流加载到LibVLC中?,file,c#-4.0,bytearray,memorystream,libvlc,File,C# 4.0,Bytearray,Memorystream,Libvlc,我想使用LibVLC从内存流播放媒体文件,如下所示: //Ideally it would go like this: LibVLC.MediaFromStream = new MemoryStream(File.ReadAllBytes(File_Path)); 当然,这是一个非常简单的版本,我想要什么,但希望它传达了我所寻找的 原因是,我希望我所做的工作具有良好的可移植性,而不必跟踪文件位置等。我宁愿在一个可以读取的文件中包含大量数据,也不愿跟踪一个或多个文件的位置 我知道这与LibVLC

我想使用LibVLC从内存流播放媒体文件,如下所示:

//Ideally it would go like this:
LibVLC.MediaFromStream = new MemoryStream(File.ReadAllBytes(File_Path));
当然,这是一个非常简单的版本,我想要什么,但希望它传达了我所寻找的

原因是,我希望我所做的工作具有良好的可移植性,而不必跟踪文件位置等。我宁愿在一个可以读取的文件中包含大量数据,也不愿跟踪一个或多个文件的位置

我知道这与LibVLC IMEM访问模块有关。然而,看看我在这方面找到了什么信息,我感觉自己好像被从飞机上扔了下来,只有几分钟的时间来学习如何在着陆前飞行。

imem没有LibVLC API,至少目前没有

不过,您仍然可以在LibVLC应用程序中使用imem,但这并不简单

如果您执行
vlc-H | grep imem
,您将看到类似的内容(这只是一些选项,还有其他选项):

--imem get函数
--imem释放功能
--imem cookie回调cookie字符串
--imem数据回调数据
通过libvlc_new()创建libvlc实例时,或通过libvlc_media_add_option()准备介质时,都可以传递这些开关的值

获取这些开关所需的值有点棘手,因为您需要将实际的内存地址(指针)传递给您在自己的应用程序中声明的回调函数。例如,您最终通过了类似于“-imem get 812911313”的测试

这样做有缺点,例如,您可能无法在流中向后/向前搜索

我在Java中成功地做到了这一点,但没有用C#(从未尝试过)


一个选择,如果你想播放存储在文件中的媒体数据,是将你的媒体存储在zip或RAR中,因为VLC有插件直接从这样的存档中播放媒体。

这里看到了我类似的问题的答案:

总之,API:

libvlc_media_t* libvlc_media_new_callbacks  (libvlc_instance_t * instance,
                                             libvlc_media_open_cb   open_cb,
                                             libvlc_media_read_cb   read_cb,
                                             libvlc_media_seek_cb   seek_cb,
                                             libvlc_media_close_cb  close_cb,
                                             void *     opaque)

就这样。必须实现这四个回调,尽管文档中指出seek回调并不总是必需的,请参阅。我在上面的回答中给出了一个部分实现的示例。

在C#xamarin中使用vlclibSharp库是否可以实现这一点。LibVLCSharp.Shared.Media=新的LibVLCSharp.Shared.Media(this.VLC,this.ReadStream);media.AddOption(“--imem get”+this.MemoryPointer);media.SaveMeta();这个.音频播放器.播放(媒体);你的链接答案是C++,我怎么才能在C++中实现这个?我从来没有尝试过C实现,但是下面看到了USER的描述。
libvlc_media_t* libvlc_media_new_callbacks  (libvlc_instance_t * instance,
                                             libvlc_media_open_cb   open_cb,
                                             libvlc_media_read_cb   read_cb,
                                             libvlc_media_seek_cb   seek_cb,
                                             libvlc_media_close_cb  close_cb,
                                             void *     opaque)