go-rtmp
go-rtmp copied to clipboard
[help] How to get "App" in "On*" hooks?
Hi!
Thanks a lot for your work!
My use cases:
- I want to publish via ffmpeg
ffmpeg -i file.mp4 -c copy -f flv rtmp://0.0.0.0:1935/xxx/yyy
- I want to read from VLC
rtmp://0.0.0.0:1935/xxx/yyy
- I want to read from HTTP
http://0.0.0.0:8080/xxx/yyy
My questions:
- Do I need to create a buffer per app?
- How to access to
App
inOnPlay
orOnPublish
hooks of handler?
Hi. Thank you for your comments!
My answers are
- 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.
- 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:
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 ;)
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:
Ok. Thanks. ;)
Good luck 🍀
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!
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.
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
Is it possible to pass the publishingName as a parameter of OnAudio/OnVideo?
Thank you!
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!
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!
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!
I'm glad to hear that!
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: