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

问题描述 投票:2回答:2

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

//Ideally it would go like this:
LibVLC.MediaFromStream = new MemoryStream(File.ReadAllBytes(File_Path));

当然,这是我想要的一个非常简单的版本,但希望它传达了我正在寻找的东西。

原因是我希望在不需要跟踪文件位置等的情况下为我正在做的事情提供大量的可移植性。我宁愿在单个文件中有大量数据,可以读取而不是跟踪一个或多个文件的位置。

我知道这与LibVLC IMEM Access模块​​有关。然而,看看我能找到的信息,我觉得我已经从飞机上被扔了,只有几分钟的时间才能学会如何在飞到地面之前飞行。

file c#-4.0 bytearray memorystream libvlc
2个回答
2
投票

在这里查看我对类似问题的回答:https://stackoverflow.com/a/31316867/2202445

总之,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)

允许这个。必须实现四个回调,尽管文档声明寻求回调并不总是必要的,请参阅libVlc documentation。我举一个上面答案中部分实现的例子。


1
投票

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

但是你仍然可以在你的LibVLC应用程序中使用imem,但这并不简单......

如果你做vlc -H | grep imem,你会看到类似的东西(这只是一些选项,还有其他选项):

  --imem-get <string>        Get function
  --imem-release <string>    Release function
  --imem-cookie <string>     Callback cookie string
  --imem-data <string>       Callback data

通过libvlc_new()创建libvlc实例时,或者通过libvlc_media_add_option()准备媒体时,可以为这些开关传递值。

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

以这种方式做到这一点有不利之处,例如:您可能无法在流中寻找后退/前进。

我在Java中成功完成了这项工作,但不是C#(从未尝试过)。

考虑是否要播放存储在文件中的媒体数据的另一种方法是将媒体存储在zip或rar中,因为vlc有插件可以直接在这些存档中播放媒体。

© www.soinside.com 2019 - 2024. All rights reserved.