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

时间:2013-12-20 01:33:17

标签: file c#-4.0 bytearray memorystream libvlc

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

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

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

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

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

2 个答案:

答案 0 :(得分: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 :(得分: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有插件可以直接在这些档案中播放媒体。