adrg / libvlc-go

Handcrafted Go bindings for libVLC and high-level media player interface
https://pkg.go.dev/github.com/adrg/libvlc-go/v3
MIT License
437 stars 50 forks source link

create function to "LoadMediaFromBuffer" #64

Closed frenos closed 3 years ago

frenos commented 3 years ago

I would like to propose a new feature: Create a function to load new media from a (go) []byte.

Background: I'm creating a stream processor that gets a lot of short videos as bytes from a message queue, reads the metadata and writes that to another queue. libvlc-go is working great for this except one thing that is currently my bottleneck: I have to write all incoming blobs to a temporary file, process them and delete the temporary file. This causes a lot of unnecessary load on the disk.

adrg commented 3 years ago

Hi @frenos. Thank you for your interest in the library. This seems like a pretty useful feature.

libVLC does not make it easy to load media from byte streams. I need to implement the libvlc_media_new_callbacks binding in order to support this and probably an abstraction over io.ReadSeeker to satisfy the callbacks libVLC requires, so it is not trivial. However, this seems like a common use case, so it's definitely something I want to support. I'll start working on it when I get some free time. I'll let you know when this is done (most likely some time next week).

adrg commented 3 years ago

Hi @frenos. I added vlc.NewMediaFromReadSeeker and Player.LoadMediaFromReadSeeker in version 3.0.9.

You can use a bytes.Reader instance to create a ReadSeeker from your byte data.

var videoBytes []byte
media, err := vlc.NewMediaFromReadSeeker(bytes.NewReader(videoBytes))
player.SetMedia(media)

or

var videoBytes []byte
media, err := player.LoadMediaFromReadSeeker(bytes.NewReader(videoBytes))