go-rtmp icon indicating copy to clipboard operation
go-rtmp copied to clipboard

[help] How to get "App" in "On*" hooks?

Open JulienBreux opened this issue 6 years ago • 13 comments

Hi!

Thanks a lot for your work!

My use cases:

  1. I want to publish via ffmpeg ffmpeg -i file.mp4 -c copy -f flv rtmp://0.0.0.0:1935/xxx/yyy
  2. I want to read from VLC rtmp://0.0.0.0:1935/xxx/yyy
  3. I want to read from HTTP http://0.0.0.0:8080/xxx/yyy

My questions:

  1. Do I need to create a buffer per app?
  2. How to access to App in OnPlay or OnPublish hooks of handler?

JulienBreux avatar Feb 13 '19 20:02 JulienBreux

Hi. Thank you for your comments!

My answers are

  1. Maybe yes. This library has not pubsub layers, thus we need implement these layers or use other middlewares to make media streaming. a. In addition, we need media conversion layers to read these streams from HTTP(HLS?) when they are published by RTMP.
  2. Currently it may have no way to do that by lacking of the API. Sorry ... :sob:

I have been developing this library by putting emphasis on subscribing from client side and publishing to server side(for internal relay server), thus the way to publish streams to client side may be lacking.

However I can make an example for simple RTMP relay server of 1:N with improving the library in a couple days. I'll do that as soon as possible. Thank you for your patience. :pray:

yutopp avatar Feb 13 '19 21:02 yutopp

Thanks a lot for this awesome complete reply :)

I can help you if you want.

Actually, we use github.com/nareix/joy4 but your code is very clear and tested ;)

JulienBreux avatar Feb 14 '19 09:02 JulienBreux

I'm sorry for my late. Now I'm busy with working on other tasks, and I don't have much time to do this task. :bowing_man:

yutopp avatar Feb 26 '19 18:02 yutopp

Ok. Thanks. ;)

Good luck 🍀

JulienBreux avatar Feb 26 '19 18:02 JulienBreux

Hello!

Are there any updates on this? I also need to access the publishingName on the OnAudio/OnVideo listeners. Can this be done now?

Thank you!

ArturFortunato avatar Feb 15 '21 09:02 ArturFortunato

Is this code helpful? If this is not what you intended, please let me know :pray:

type Handler struct {
	rtmp.DefaultHandler

	// value holders
	app string
	publishingName string
}

func (h *Handler) OnConnect(timestamp uint32, cmd *rtmpmsg.NetConnectionConnect) error {
	h.app = cmd.Command.App // Save values to each handler instances

	return nil
}

func (h *Handler) OnPublish(timestamp uint32, cmd *rtmpmsg.NetStreamPublish) error {
	log.Printf("App Name: %v", h.app) // Read the 'App' value saved in the handler

	h.publishingName = cmd.PublishingName // Same

	return nil
}

func (h *Handler) OnAudio(timestamp uint32, payload io.Reader) error {
	log.Printf("App Name: %v", h.publishingName) // Read the 'PublishingName' value saved in the handler
}

Thank you.

yutopp avatar Feb 15 '21 15:02 yutopp

Hello!

This will only allow for 1 publishingName, right? I need to have multiple inputs and to write audio/video only for peers watching the video publishingName

ArturFortunato avatar Feb 15 '21 15:02 ArturFortunato

Is it possible to pass the publishingName as a parameter of OnAudio/OnVideo?

Thank you!

ArturFortunato avatar Feb 15 '21 16:02 ArturFortunato

Is this code helpful? If this is not what you intended, please let me know

type Handler struct {
	rtmp.DefaultHandler

	// value holders
	app string
	publishingName string
}

func (h *Handler) OnConnect(timestamp uint32, cmd *rtmpmsg.NetConnectionConnect) error {
	h.app = cmd.Command.App // Save values to each handler instances

	return nil
}

func (h *Handler) OnPublish(timestamp uint32, cmd *rtmpmsg.NetStreamPublish) error {
	log.Printf("App Name: %v", h.app) // Read the 'App' value saved in the handler

	h.publishingName = cmd.PublishingName // Same

	return nil
}

func (h *Handler) OnAudio(timestamp uint32, payload io.Reader) error {
	log.Printf("App Name: %v", h.publishingName) // Read the 'PublishingName' value saved in the handler
}

Thank you.

@yutopp I have tested this and it only works with 1 video input. I have been trying to understand the structure of the project, but haven't been able to understand where should I store the PushingName (or another identifier) that allows me to serve multiple input streams. Can you help me?

Thank you in advance!

ArturFortunato avatar Feb 16 '21 18:02 ArturFortunato

Sorry for the roughness, but I've added a sample that relays RTMP streams by stream name.

https://github.com/yutopp/go-rtmp/tree/master/example/server_relay_demo

It can handle multiple input streams per publishing names. Please comments if I'm missing anything.

Thanks!

yutopp avatar Feb 16 '21 21:02 yutopp

Hello! Thank you so much, that seems to do the trick! I want to output the videos with WebRTC, so I still need to adapt the code and complete some things, but with RTMP it works perfectly!

I will give feedback as soon as I make it work with webRTC!

Again, thank you!

ArturFortunato avatar Feb 17 '21 16:02 ArturFortunato

I'm glad to hear that!

yutopp avatar Feb 18 '21 14:02 yutopp

Hi. I have been adapting the code for webRTC output, and it worked with a single input, but as soon as I start streaming to a second publishingname, the first one freezes. I have been trying to understand your example and I cannot understand how can the server be aware of the publishingname on OnAudio/OnVideo. I figured it should be the connection set on OnPlay (although I fail to understand virifications such as

if h.sub != nil {
		return errors.New("Cannot play on this stream")
	}

But my problem is, as the OnPlay will not be executed in my code (as it won't be an RTMP client, but a webRTC one), how can I replicate what you did here?

Thank you so much for your help :smile:

ArturFortunato avatar Feb 21 '21 11:02 ArturFortunato