Add public AMF0 and RTMP protocol interfaces, update the RTMP proxy to use the accessor APIs, and cover AMF0 encoding/decoding with unit tests and examples.
63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
// Copyright (c) 2026 Winlin
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
package rtmp_test
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"srsx/internal/rtmp"
|
|
)
|
|
|
|
func ExampleAmf0Number() {
|
|
number := rtmp.NewAmf0Number(3.14)
|
|
b, err := number.MarshalBinary()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
value, err := rtmp.Amf0Discovery(b)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err := value.UnmarshalBinary(b); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
converter := rtmp.NewAmf0Converter(value)
|
|
fmt.Println("number:", converter.ToNumber().Float64())
|
|
fmt.Println("is string:", converter.ToString() != nil)
|
|
|
|
// Output:
|
|
// number: 3.14
|
|
// is string: false
|
|
}
|
|
|
|
func ExampleAmf0Object() {
|
|
object := rtmp.NewAmf0Object().
|
|
Set("code", rtmp.NewAmf0Number(100)).
|
|
Set("level", rtmp.NewAmf0String("status"))
|
|
b, err := object.MarshalBinary()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
value, err := rtmp.Amf0Discovery(b)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if err := value.UnmarshalBinary(b); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
converter := rtmp.NewAmf0Converter(value)
|
|
fmt.Println("code:", rtmp.NewAmf0Converter(converter.ToObject().Get("code")).ToNumber().Float64())
|
|
fmt.Println("level:", rtmp.NewAmf0Converter(converter.ToObject().Get("level")).ToString().String())
|
|
fmt.Println("is number:", converter.ToNumber() != nil)
|
|
|
|
// Output:
|
|
// code: 100
|
|
// level: status
|
|
// is number: false
|
|
}
|