【问题标题】:How can I load a memory stream into LibVLC?如何将内存流加载到 LibVLC 中?
【发布时间】:2013-12-20 01:33:17
【问题描述】:

我想使用 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


    【解决方案1】:

    在此处查看我对类似问题的回答: 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。我在上面的答案中给出了一个部分实现的例子。

    【讨论】:

    • 您的链接答案是 C++,我怎样才能在 C# 中实现这一点?
    • 我从未尝试过 C# 实现,但请参阅下面 user3888775 的评论。
    • @Flakker 你会给出一个 c++ 类的例子来实现它吗?
    【解决方案2】:

    没有用于 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”之类的内容。

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

    我已经在 J​​ava 中成功地做到了这一点,但不是 C#(从未尝试过)。

    如果您想播放存储在文件中的媒体数据,另一种考虑是将媒体存储在 zip 或 rar 中,因为 vlc 有插件可以直接从此类存档中播放媒体。

    【讨论】:

    • 是否可以使用 vlclibSharp 库在 C# xamarin 中执行此操作。 LibVLCSharp.Shared.Media 媒体 = 新的 LibVLCSharp.Shared.Media(this.VLC, this.ReadStream); media.AddOption("--imem-get "+this.MemoryPointer); media.SaveMeta(); this.AudioPlayer.Play(媒体);
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2017-06-07
    • 1970-01-01
    • 2011-04-12
    • 2015-07-04
    相关资源
    最近更新 更多