raw muxer annexB h264 h265
This commit is contained in:
46
format/raw/muxer.go
Normal file
46
format/raw/muxer.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package raw
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
|
||||
"github.com/deepch/vdk/codec/h265parser"
|
||||
|
||||
"github.com/deepch/vdk/codec/h264parser"
|
||||
|
||||
"github.com/deepch/vdk/av"
|
||||
)
|
||||
|
||||
var startCode = []byte{0, 0, 0, 1}
|
||||
|
||||
type Muxer struct {
|
||||
idx int8
|
||||
w io.WriteSeeker
|
||||
}
|
||||
|
||||
func NewMuxer(v io.WriteSeeker) *Muxer {
|
||||
return &Muxer{w: v}
|
||||
}
|
||||
func (element *Muxer) WriteHeader(streams []av.CodecData) (err error) {
|
||||
for i, stream := range streams {
|
||||
switch stream.Type() {
|
||||
case av.H264:
|
||||
_, err = element.w.Write(append(startCode, bytes.Join([][]byte{stream.(h264parser.CodecData).SPS(), stream.(h264parser.CodecData).PPS()}, startCode)...))
|
||||
element.idx = int8(i)
|
||||
case av.H265:
|
||||
_, err = element.w.Write(append(startCode, bytes.Join([][]byte{stream.(h265parser.CodecData).SPS(), stream.(h265parser.CodecData).PPS(), stream.(h265parser.CodecData).VPS()}, startCode)...))
|
||||
element.idx = int8(i)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
func (element *Muxer) WritePacket(pkt *av.Packet) (err error) {
|
||||
if pkt.Idx == element.idx {
|
||||
_, err = element.w.Write(startCode)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
_, err = element.w.Write(pkt.Data[4:])
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -104,6 +104,8 @@ func Parse(content string) (sess Session, medias []Media) {
|
||||
}
|
||||
case "H264":
|
||||
media.Type = av.H264
|
||||
case "JPEG":
|
||||
media.Type = av.JPEG
|
||||
case "H265":
|
||||
media.Type = av.H265
|
||||
case "HEVC":
|
||||
|
||||
@@ -170,6 +170,10 @@ func Dial(options RTSPClientOptions) (*RTSPClient, error) {
|
||||
client.CodecData = append(client.CodecData, h265parser.CodecData{})
|
||||
}
|
||||
client.videoCodec = av.H265
|
||||
//} else if i2.Type == av.JPEG {
|
||||
// client.CodecData = append(client.CodecData, h264parser.CodecData{})
|
||||
// client.WaitCodec = true
|
||||
// client.videoCodec = av.H264
|
||||
} else {
|
||||
client.Println("SDP Video Codec Type Not Supported", i2.Type)
|
||||
}
|
||||
@@ -216,7 +220,7 @@ func Dial(options RTSPClientOptions) (*RTSPClient, error) {
|
||||
}
|
||||
ch += 2
|
||||
}
|
||||
|
||||
//test := map[string]string{"Scale": "1.000000", "Speed": "1.000000", "Range": "clock=20210929T210000Z-20210929T211000Z"}
|
||||
err = client.request(PLAY, nil, client.control, false, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -607,7 +611,7 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) {
|
||||
client.BufferRtpPacket.Write(nal[3:])
|
||||
}
|
||||
default:
|
||||
client.Println("Unsupported Nal", naluType)
|
||||
//client.Println("Unsupported Nal", naluType)
|
||||
}
|
||||
|
||||
} else if client.videoCodec == av.H264 {
|
||||
@@ -671,7 +675,7 @@ func (client *RTSPClient) RTPDemuxer(payloadRAW *[]byte) ([]*av.Packet, bool) {
|
||||
}
|
||||
}
|
||||
default:
|
||||
client.Println("Unsupported NAL Type", naluType)
|
||||
//client.Println("Unsupported NAL Type", naluType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user