mirror of
https://github.com/Monibuca/plugin-rtmp.git
synced 2025-09-27 12:02:50 +08:00
feat: optimize sendFrame
This commit is contained in:
23
media.go
23
media.go
@@ -2,6 +2,7 @@ package rtmp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"net"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
@@ -27,6 +28,7 @@ func (av *AVSender) sendSequenceHead(seqHead []byte) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (av *AVSender) sendFrame(frame *common.AVFrame, absTime uint32) (err error) {
|
func (av *AVSender) sendFrame(frame *common.AVFrame, absTime uint32) (err error) {
|
||||||
|
seq := frame.Sequence
|
||||||
payloadLen := frame.AVCC.ByteLength
|
payloadLen := frame.AVCC.ByteLength
|
||||||
if payloadLen == 0 {
|
if payloadLen == 0 {
|
||||||
err := errors.New("payload is empty")
|
err := errors.New("payload is empty")
|
||||||
@@ -55,17 +57,22 @@ func (av *AVSender) sendFrame(frame *common.AVFrame, absTime uint32) (err error)
|
|||||||
av.SetTimestamp(frame.DeltaTime)
|
av.SetTimestamp(frame.DeltaTime)
|
||||||
av.WriteTo(RTMP_CHUNK_HEAD_8, &av.chunkHeader)
|
av.WriteTo(RTMP_CHUNK_HEAD_8, &av.chunkHeader)
|
||||||
}
|
}
|
||||||
|
//数据被覆盖导致序号变了
|
||||||
|
if seq != frame.Sequence {
|
||||||
|
return errors.New("sequence is not equal")
|
||||||
|
}
|
||||||
r := frame.AVCC.NewReader()
|
r := frame.AVCC.NewReader()
|
||||||
chunk := r.ReadN(av.writeChunkSize)
|
chunk := net.Buffers{av.chunkHeader}
|
||||||
// payloadLen -= util.SizeOfBuffers(chunk)
|
av.writeSeqNum += uint32(av.chunkHeader.Len() + r.WriteNTo(av.writeChunkSize, &chunk))
|
||||||
av.sendChunk(chunk...)
|
for r.CanRead() {
|
||||||
if r.CanRead() {
|
item := av.bytePool.Get(16)
|
||||||
|
defer item.Recycle()
|
||||||
|
av.WriteTo(RTMP_CHUNK_HEAD_1, &item.Value)
|
||||||
// 如果在音视频数据太大,一次发送不完,那么这里进行分割(data + Chunk Basic Header(1))
|
// 如果在音视频数据太大,一次发送不完,那么这里进行分割(data + Chunk Basic Header(1))
|
||||||
for av.WriteTo(RTMP_CHUNK_HEAD_1, &av.chunkHeader); r.CanRead(); av.sendChunk(chunk...) {
|
chunk = append(chunk, item.Value)
|
||||||
chunk = r.ReadN(av.writeChunkSize)
|
av.writeSeqNum += uint32(item.Value.Len() + r.WriteNTo(av.writeChunkSize, &chunk))
|
||||||
// payloadLen -= util.SizeOfBuffers(chunk)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
chunk.WriteTo(av.Conn)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user