Skip to content

Playing form an url using an API is not working #104

Open
@SamuelMR98

Description

So I'm implementing an API that receives an URL in JSON format from an HTTP request, and plays the video using VLC. However, the player never starts, when I use the -vvv flag VLC seems to be alive but not reproducing anything. FYI, I'm currently running this on Manjaro, but plan to implement it on a Rasp Berry Pi running on Raspbian. Thanks in advance.

Here's what I have so far:

my handler:

func (v *VlcManager) playStream(c *gin.Context) {
	v.Log.Debug("playing stream")

	Player = nil

	// Get the infor from streamURL json
	var streamURL StreamURL
	err := c.BindJSON(&streamURL)
	if err != nil {
		v.Log.Warn("failed to bind json", zap.Error(err))
		c.JSON(http.StatusInternalServerError, err)
		return
	}
	url := string(streamURL.URL)
	fmt.Println("url: ", url)

	if v.ConfigService != nil {
		stream, err := v.ConfigService.GetStreamConfig(c.Request.Context(), url)
		if err == nil && stream.Secret != "" {
			// the token is everything after the base URL
			token, err := v.generateToken(stream)
			if err != nil {
				v.Log.Error("error generating secure token: %s", zap.Error(err))
				c.JSON(http.StatusInternalServerError, err)
				return
			}
			v.Log.Info("generated secure token", zap.String("token", token))
			url += token
		}

	}
	Player, err = helpers.SwitchStream(Player, url)
	if err != nil {
		v.Log.Warn("failed to switch stream", zap.Error(err))
		c.JSON(http.StatusInternalServerError, err)
		return
	}
	c.JSON(http.StatusOK, "stream playing")
}

the actual command:

func SwitchStream(player *vlc.Player, stream string) (*vlc.Player, error) {

	// Initialize libVLC. Additional command line arguments can be passed in
	// to the libVLC by specifying them in the Init function.
	if err := vlc.Init("-vvv"); err != nil {
		log.Fatal(err)
		return nil, err
	}
	defer vlc.Release()

	// Create a new player.
	player, err := vlc.NewPlayer()
	if err != nil {
		log.Fatal(err)
		return nil, err
	}
	defer func() {
		player.Stop()
		player.Release()
	}()

	media, err := player.LoadMediaFromURL(stream)
	if err != nil {
		log.Fatal(err)
		log.Printf("error loading media: %s", err)
		return nil, err
	}
	defer media.Release()

	manager, err := player.EventManager()
	if err != nil {
		log.Fatal(err)
	}

	quit := make(chan struct{})
	eventCallback := func(event vlc.Event, userData interface{}) {
		close(quit)
	}

	eventID, err := manager.Attach(vlc.MediaPlayerEndReached, eventCallback, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer manager.Detach(eventID)

	if err != nil {
		log.Fatal(err)
	}
	defer manager.Detach(eventID)

	//Start playing the media.
	if err = player.Play(); err != nil {
		log.Fatal(err)
		log.Printf("error playing media: %s", err)
		return nil, err
	}

	<-quit

	return player, nil
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions