test transcode slow
This commit is contained in:
parent
c923e0010b
commit
175afae1c1
64
example/transcoder/main.go
Normal file
64
example/transcoder/main.go
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/deepch/vdk/format/rtspv2"
|
||||||
|
"github.com/deepch/vdk/format/ts"
|
||||||
|
"log"
|
||||||
|
"os/exec"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
RTSPClient, err := rtspv2.Dial(rtspv2.RTSPClientOptions{URL: "rtsp://url", DisableAudio: true, DialTimeout: 3 * time.Second, ReadWriteTimeout: 5 * time.Second, Debug: true, OutgoingProxy: false})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
cmd := exec.CommandContext(ctx, "ffmpeg", "-flags", "low_delay", "-analyzeduration", "1", "-fflags", "-nobuffer", "-probesize", "1024k", "-f", "mpegts", "-i", "-", "-vcodec", "libx264", "-preset", "ultrafast", "-bf", "0", "-f", "mpegts", "-max_muxing_queue_size", "400", "-pes_payload_size", "0", "pipe:1")
|
||||||
|
inPipe, _ := cmd.StdinPipe()
|
||||||
|
outPipe, _ := cmd.StdoutPipe()
|
||||||
|
//cmd.Stderr = os.Stderr
|
||||||
|
mux := ts.NewMuxer(inPipe)
|
||||||
|
demuxer := ts.NewDemuxer(outPipe)
|
||||||
|
codec := RTSPClient.CodecData
|
||||||
|
mux.WriteHeader(codec)
|
||||||
|
go func() {
|
||||||
|
imNewCodec, err := demuxer.Streams()
|
||||||
|
log.Println("new codec data", imNewCodec, err)
|
||||||
|
for i, data := range imNewCodec {
|
||||||
|
log.Println(i, data)
|
||||||
|
}
|
||||||
|
for {
|
||||||
|
pkt, err := demuxer.ReadPacket()
|
||||||
|
if err != nil {
|
||||||
|
log.Panic(err)
|
||||||
|
}
|
||||||
|
log.Println("im new pkt ===>", pkt.Idx, pkt.Time)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
cmd.Start()
|
||||||
|
var start bool
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case signals := <-RTSPClient.Signals:
|
||||||
|
switch signals {
|
||||||
|
case rtspv2.SignalCodecUpdate:
|
||||||
|
//?
|
||||||
|
case rtspv2.SignalStreamRTPStop:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case packetAV := <-RTSPClient.OutgoingPacketQueue:
|
||||||
|
if packetAV.IsKeyFrame {
|
||||||
|
start = true
|
||||||
|
}
|
||||||
|
if !start {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if err = mux.WritePacket(*packetAV); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -376,7 +376,7 @@ func (self *ElemStreamDesc) parseDescHdr(b []byte, offset int) (n int, tag uint8
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadFileAtoms(r io.ReadSeeker) (atoms []Atom, err error) {
|
func ReadFileAtoms(r io.ReadSeeker, name string) (atoms []Atom, err error) {
|
||||||
for {
|
for {
|
||||||
offset, _ := r.Seek(0, 1)
|
offset, _ := r.Seek(0, 1)
|
||||||
taghdr := make([]byte, 8)
|
taghdr := make([]byte, 8)
|
||||||
@ -387,6 +387,12 @@ func ReadFileAtoms(r io.ReadSeeker) (atoms []Atom, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
size := pio.U32BE(taghdr[0:])
|
size := pio.U32BE(taghdr[0:])
|
||||||
|
|
||||||
|
if size == 0 {
|
||||||
|
err = fmt.Errorf("bad hdr size")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
tag := Tag(pio.U32BE(taghdr[4:]))
|
tag := Tag(pio.U32BE(taghdr[4:]))
|
||||||
|
|
||||||
var atom Atom
|
var atom Atom
|
||||||
|
@ -2,6 +2,7 @@ package ts
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/deepch/vdk/codec/h265parser"
|
||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -11,7 +12,7 @@ import (
|
|||||||
"github.com/deepch/vdk/format/ts/tsio"
|
"github.com/deepch/vdk/format/ts/tsio"
|
||||||
)
|
)
|
||||||
|
|
||||||
var CodecTypes = []av.CodecType{av.H264, av.AAC}
|
var CodecTypes = []av.CodecType{av.H264, av.H265, av.AAC}
|
||||||
|
|
||||||
type Muxer struct {
|
type Muxer struct {
|
||||||
w io.Writer
|
w io.Writer
|
||||||
@ -123,6 +124,11 @@ func (self *Muxer) WritePATPMT() (err error) {
|
|||||||
StreamType: tsio.ElementaryStreamTypeH264,
|
StreamType: tsio.ElementaryStreamTypeH264,
|
||||||
ElementaryPID: stream.pid,
|
ElementaryPID: stream.pid,
|
||||||
})
|
})
|
||||||
|
case av.H265:
|
||||||
|
elemStreams = append(elemStreams, tsio.ElementaryStreamInfo{
|
||||||
|
StreamType: tsio.ElementaryStreamTypeH265,
|
||||||
|
ElementaryPID: stream.pid,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,6 +216,36 @@ func (self *Muxer) WritePacket(pkt av.Packet) (err error) {
|
|||||||
n := tsio.FillPESHeader(self.peshdr, tsio.StreamIdH264, -1, pkt.Time+pkt.CompositionTime, pkt.Time)
|
n := tsio.FillPESHeader(self.peshdr, tsio.StreamIdH264, -1, pkt.Time+pkt.CompositionTime, pkt.Time)
|
||||||
datav[0] = self.peshdr[:n]
|
datav[0] = self.peshdr[:n]
|
||||||
|
|
||||||
|
if err = stream.tsw.WritePackets(self.w, datav, pkt.Time, pkt.IsKeyFrame, false); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case av.H265:
|
||||||
|
codec := stream.CodecData.(h265parser.CodecData)
|
||||||
|
|
||||||
|
nalus := self.nalus[:0]
|
||||||
|
if pkt.IsKeyFrame {
|
||||||
|
nalus = append(nalus, codec.SPS())
|
||||||
|
nalus = append(nalus, codec.PPS())
|
||||||
|
nalus = append(nalus, codec.VPS())
|
||||||
|
}
|
||||||
|
pktnalus, _ := h265parser.SplitNALUs(pkt.Data)
|
||||||
|
for _, nalu := range pktnalus {
|
||||||
|
nalus = append(nalus, nalu)
|
||||||
|
}
|
||||||
|
|
||||||
|
datav := self.datav[:1]
|
||||||
|
for i, nalu := range nalus {
|
||||||
|
if i == 0 {
|
||||||
|
datav = append(datav, h265parser.AUDBytes)
|
||||||
|
} else {
|
||||||
|
datav = append(datav, h265parser.StartCodeBytes)
|
||||||
|
}
|
||||||
|
datav = append(datav, nalu)
|
||||||
|
}
|
||||||
|
|
||||||
|
n := tsio.FillPESHeader(self.peshdr, tsio.StreamIdH264, -1, pkt.Time+pkt.CompositionTime, pkt.Time)
|
||||||
|
datav[0] = self.peshdr[:n]
|
||||||
|
|
||||||
if err = stream.tsw.WritePackets(self.w, datav, pkt.Time, pkt.IsKeyFrame, false); err != nil {
|
if err = stream.tsw.WritePackets(self.w, datav, pkt.Time, pkt.IsKeyFrame, false); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ const (
|
|||||||
ElementaryStreamTypeH264 = 0x1B
|
ElementaryStreamTypeH264 = 0x1B
|
||||||
ElementaryStreamTypeAdtsAAC = 0x0F
|
ElementaryStreamTypeAdtsAAC = 0x0F
|
||||||
ElementaryStreamTypeAlignmentDescriptor = 0x06
|
ElementaryStreamTypeAlignmentDescriptor = 0x06
|
||||||
|
ElementaryStreamTypeH265 = 0x24
|
||||||
)
|
)
|
||||||
|
|
||||||
type PATEntry struct {
|
type PATEntry struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user