This commit is contained in:
Andrey Semochkin
2021-05-08 23:07:59 +03:00
parent 338966ed52
commit 5adbbcc01f
5 changed files with 190 additions and 22 deletions

1
format/hls/muxer.go Normal file
View File

@@ -0,0 +1 @@
package hls

View File

@@ -10,6 +10,7 @@ import (
"github.com/deepch/vdk/codec/aacparser"
"github.com/deepch/vdk/codec/h264parser"
"github.com/deepch/vdk/codec/h265parser"
"github.com/deepch/vdk/format/fmp4/fmp4io"
"github.com/deepch/vdk/format/mp4/mp4io"
"github.com/deepch/vdk/format/mp4f/mp4fio"
"github.com/deepch/vdk/utils/bits/pio"
@@ -312,6 +313,11 @@ func (element *Muxer) WritePacket4(pkt av.Packet) error {
return stream.writePacketV4(pkt)
}
func (element *Stream) writePacketV4(pkt av.Packet) error {
//pkt.Data = pkt.Data[4:]
defaultFlags := fmp4io.SampleNonKeyframe
if pkt.IsKeyFrame {
defaultFlags = fmp4io.SampleNoDependencies
}
trackID := pkt.Idx + 1
if element.sampleIndex == 0 {
element.moof.Header = &mp4fio.MovieFragHeader{Seqnum: uint32(element.muxer.fragmentIndex + 1)}
@@ -327,7 +333,7 @@ func (element *Stream) writePacketV4(pkt av.Packet) error {
},
Run: &mp4fio.TrackFragRun{
Flags: 0x000b05,
FirstSampleFlags: 0x02000000,
FirstSampleFlags: uint32(defaultFlags),
DataOffset: 0,
Entries: []mp4io.TrackFragRunEntry{},
},
@@ -339,7 +345,9 @@ func (element *Stream) writePacketV4(pkt av.Packet) error {
Duration: uint32(element.timeToTs(pkt.Duration)),
Size: uint32(len(pkt.Data)),
Cts: uint32(element.timeToTs(pkt.CompositionTime)),
Flags: uint32(defaultFlags),
}
//log.Println("packet", defaultFlags,pkt.Duration, pkt.CompositionTime)
element.moof.Tracks[0].Run.Entries = append(element.moof.Tracks[0].Run.Entries, runEnrty)
element.buffer = append(element.buffer, pkt.Data...)
element.sampleIndex++
@@ -347,6 +355,9 @@ func (element *Stream) writePacketV4(pkt av.Packet) error {
return nil
}
func (element *Muxer) SetIndex(val int) {
element.fragmentIndex = val
}
func (element *Stream) writePacketV3(pkt av.Packet, rawdur time.Duration, maxFrames int) (bool, []byte, error) {
trackID := pkt.Idx + 1
var out []byte

View File

@@ -18,6 +18,7 @@ type Session struct {
type Media struct {
AVType string
Type av.CodecType
FPS int
TimeScale int
Control string
Rtpmap int
@@ -37,6 +38,10 @@ func Parse(content string) (sess Session, medias []Media) {
for _, line := range strings.Split(content, "\n") {
line = strings.TrimSpace(line)
////Camera [BUG] a=x-framerate: 25
if strings.Contains(line, "x-framerate") {
line = strings.Replace(line, " ", "", -1)
}
typeval := strings.SplitN(line, "=", 2)
if len(typeval) == 2 {
fields := strings.SplitN(typeval[1], " ", 2)
@@ -78,6 +83,8 @@ func Parse(content string) (sess Session, medias []Media) {
media.Control = val
case "rtpmap":
media.Rtpmap, _ = strconv.Atoi(val)
case "x-framerate":
media.FPS, _ = strconv.Atoi(val)
}
}
keyval = strings.Split(field, "/")

View File

@@ -85,6 +85,7 @@ type RTSPClient struct {
PreAudioTS int64
PreVideoTS int64
PreSequenceNumber int
FPS int
}
type RTSPClientOptions struct {
@@ -153,6 +154,7 @@ func Dial(options RTSPClientOptions) (*RTSPClient, error) {
} else {
client.CodecData = append(client.CodecData, h264parser.CodecData{})
}
client.FPS = i2.FPS
client.videoCodec = av.H264
} else if i2.Type == av.H265 {
if len(i2.SpropVPS) > 1 && len(i2.SpropSPS) > 1 && len(i2.SpropPPS) > 1 {