Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
JulienBreux opened this issue Feb 13, 2019 · 13 comments
Open

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

JulienBreux opened this issue Feb 13, 2019 · 13 comments
Assignees

Comments

@JulienBreux
Copy link
Contributor

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?
@yutopp
Copy link
Owner

yutopp commented Feb 13, 2019

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 ... 😭

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. 🙏

@yutopp yutopp self-assigned this Feb 14, 2019
@JulienBreux
Copy link
Contributor Author

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 ;)

@yutopp
Copy link
Owner

yutopp commented Feb 26, 2019

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. 🙇‍♂️

@JulienBreux
Copy link
Contributor Author

Ok. Thanks. ;)

Good luck 🍀

@ArturFortunato
Copy link

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!

@yutopp
Copy link
Owner

yutopp commented Feb 15, 2021

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.

@ArturFortunato
Copy link

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
Copy link

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

Thank you!

@ArturFortunato
Copy link

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!

@yutopp
Copy link
Owner

yutopp commented Feb 16, 2021

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!

@ArturFortunato
Copy link

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!

@yutopp
Copy link
Owner

yutopp commented Feb 18, 2021

I'm glad to hear that!

@ArturFortunato
Copy link

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 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants