2013-12-20 31 views
0

我想從使用LibVLC像這樣一個內存流播放媒體文件:如何將內存流加載到LibVLC中?

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

當然,這是我想要的很過分簡化版本,但希望它傳達我所期待的。

原因是我希望有一個很好的便攜性爲我在做什麼,而不必跟蹤文件位置等。我寧願在一個文件中有大量的數據可以讀取,而不必跟蹤一個或多個文件的位置。

我知道這與LibVLC IMEM Access模塊​​有關。然而,看看我能找到的信息,我覺得我已經從飛機上拋下了,只有幾分鐘的時間來學習如何飛行,然後才能在地面上飛行。

回答

0

還有沒有 imem的LibVLC API,至少目前沒有。

但是,您仍然可以使用IMEM在LibVLC應用程序,但它不是簡單的......

如果你這樣做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有插件可以直接在這些存檔中播放媒體。

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。我在上面的答案中給出了部分實現的例子。