mirror of https://bitbucket.org/ausocean/av.git
revid: pid for audio being written to mts packets
This commit is contained in:
parent
3484e35692
commit
b1e5b4341f
|
@ -62,7 +62,7 @@ const (
|
||||||
defaultLogVerbosity = logger.Info
|
defaultLogVerbosity = logger.Info
|
||||||
defaultSleepTime = 60 // Seconds
|
defaultSleepTime = 60 // Seconds
|
||||||
sampleSize = 2 // Bytes
|
sampleSize = 2 // Bytes
|
||||||
blockSize = 16000 // Bytes
|
chunkSize = 16000 // Bytes
|
||||||
)
|
)
|
||||||
|
|
||||||
// canProfile is set to false with revid-cli is built with "-tags profile".
|
// canProfile is set to false with revid-cli is built with "-tags profile".
|
||||||
|
@ -195,7 +195,7 @@ func handleFlags() revid.Config {
|
||||||
|
|
||||||
switch *inputPtr {
|
switch *inputPtr {
|
||||||
case "Audio":
|
case "Audio":
|
||||||
cfg.WriteRate = float64(*sampleRatePtr*sampleSize) / float64(blockSize)
|
cfg.WriteRate = float64(*sampleRatePtr*sampleSize) / float64(chunkSize)
|
||||||
default:
|
default:
|
||||||
cfg.WriteRate = float64(*frameRatePtr)
|
cfg.WriteRate = float64(*frameRatePtr)
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,8 +43,8 @@ func TestEncodePcm(t *testing.T) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
sampleRate := 48000
|
sampleRate := 48000
|
||||||
sampleSize := 2
|
sampleSize := 2
|
||||||
blockSize := 16000
|
chunkSize := 16000
|
||||||
writeFreq := float64(sampleRate*sampleSize) / float64(blockSize)
|
writeFreq := float64(sampleRate*sampleSize) / float64(chunkSize)
|
||||||
e := NewEncoder(&buf, writeFreq, Audio)
|
e := NewEncoder(&buf, writeFreq, Audio)
|
||||||
|
|
||||||
inPath := "../../../test/test-data/av/input/sweep_400Hz_20000Hz_-3dBFS_5s_48khz.pcm"
|
inPath := "../../../test/test-data/av/input/sweep_400Hz_20000Hz_-3dBFS_5s_48khz.pcm"
|
||||||
|
@ -54,15 +54,15 @@ func TestEncodePcm(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Break pcm into blocks and encode to mts and get the resulting bytes.
|
// Break pcm into blocks and encode to mts and get the resulting bytes.
|
||||||
for i := 0; i < len(inPcm); i += blockSize {
|
for i := 0; i < len(inPcm); i += chunkSize {
|
||||||
if len(inPcm)-i < blockSize {
|
if len(inPcm)-i < chunkSize {
|
||||||
block := inPcm[i:]
|
block := inPcm[i:]
|
||||||
_, err = e.Write(block)
|
_, err = e.Write(block)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unable to write block: %v", err)
|
t.Errorf("unable to write block: %v", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
block := inPcm[i : i+blockSize]
|
block := inPcm[i : i+chunkSize]
|
||||||
_, err = e.Write(block)
|
_, err = e.Write(block)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unable to write block: %v", err)
|
t.Errorf("unable to write block: %v", err)
|
||||||
|
@ -73,7 +73,7 @@ func TestEncodePcm(t *testing.T) {
|
||||||
|
|
||||||
// Get the first MTS packet to check
|
// Get the first MTS packet to check
|
||||||
var pkt packet.Packet
|
var pkt packet.Packet
|
||||||
pesPacket := make([]byte, 0, blockSize)
|
pesPacket := make([]byte, 0, chunkSize)
|
||||||
got := make([]byte, 0, len(inPcm))
|
got := make([]byte, 0, len(inPcm))
|
||||||
i := 0
|
i := 0
|
||||||
if i+PacketSize <= len(clip) {
|
if i+PacketSize <= len(clip) {
|
||||||
|
|
|
@ -103,7 +103,8 @@ const (
|
||||||
patPid = 0
|
patPid = 0
|
||||||
pmtPid = 4096
|
pmtPid = 4096
|
||||||
videoPid = 256
|
videoPid = 256
|
||||||
audioPid = 210
|
// AudioPid is the Id for packets containing audio data
|
||||||
|
AudioPid = 210
|
||||||
videoStreamID = 0xe0 // First video stream ID.
|
videoStreamID = 0xe0 // First video stream ID.
|
||||||
audioStreamID = 0xc0 // First audio stream ID.
|
audioStreamID = 0xc0 // First audio stream ID.
|
||||||
)
|
)
|
||||||
|
@ -154,7 +155,7 @@ func NewEncoder(dst io.Writer, rate float64, mediaType int) *Encoder {
|
||||||
var sid byte
|
var sid byte
|
||||||
switch mediaType {
|
switch mediaType {
|
||||||
case Audio:
|
case Audio:
|
||||||
mPid = audioPid
|
mPid = AudioPid
|
||||||
sid = audioStreamID
|
sid = audioStreamID
|
||||||
case Video:
|
case Video:
|
||||||
mPid = videoPid
|
mPid = videoPid
|
||||||
|
@ -248,7 +249,9 @@ func (e *Encoder) Write(data []byte) (int, error) {
|
||||||
pkt.PCR = e.pcr()
|
pkt.PCR = e.pcr()
|
||||||
pusi = false
|
pusi = false
|
||||||
}
|
}
|
||||||
_, err := e.dst.Write(pkt.Bytes(e.tsSpace[:PacketSize]))
|
bytes := pkt.Bytes(e.tsSpace[:PacketSize])
|
||||||
|
fmt.Printf("Packet: %v", bytes)
|
||||||
|
_, err := e.dst.Write(bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return len(data), err
|
return len(data), err
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,7 +187,7 @@ func (r *Revid) setConfig(config Config) error {
|
||||||
// mtsEnc and flvEnc will be called to obtain an mts encoder and flv encoder
|
// mtsEnc and flvEnc will be called to obtain an mts encoder and flv encoder
|
||||||
// respectively. multiWriter will be used to create an ioext.multiWriteCloser
|
// respectively. multiWriter will be used to create an ioext.multiWriteCloser
|
||||||
// so that encoders can write to multiple senders.
|
// so that encoders can write to multiple senders.
|
||||||
func (r *Revid) setupPipeline(mtsEnc, flvEnc func(dst io.Writer, rate int) (io.Writer, error), multiWriter func(...io.WriteCloser) io.WriteCloser) error {
|
func (r *Revid) setupPipeline(mtsEnc func(dst io.Writer, rate, mediaType int) (io.Writer, error), flvEnc func(dst io.Writer, rate int) (io.Writer, error), multiWriter func(...io.WriteCloser) io.WriteCloser) error {
|
||||||
r.buffer = (*buffer)(ring.NewBuffer(ringBufferSize, ringBufferElementSize, writeTimeout))
|
r.buffer = (*buffer)(ring.NewBuffer(ringBufferSize, ringBufferElementSize, writeTimeout))
|
||||||
|
|
||||||
r.encoder = r.encoder[:0]
|
r.encoder = r.encoder[:0]
|
||||||
|
@ -231,7 +231,13 @@ func (r *Revid) setupPipeline(mtsEnc, flvEnc func(dst io.Writer, rate int) (io.W
|
||||||
// as a destination.
|
// as a destination.
|
||||||
if len(mtsSenders) != 0 {
|
if len(mtsSenders) != 0 {
|
||||||
mw := multiWriter(mtsSenders...)
|
mw := multiWriter(mtsSenders...)
|
||||||
e, _ := mtsEnc(mw, int(r.config.FrameRate))
|
var mediaType int
|
||||||
|
if r.config.Input == Audio {
|
||||||
|
mediaType = mts.Audio
|
||||||
|
} else {
|
||||||
|
mediaType = mts.Video
|
||||||
|
}
|
||||||
|
e, _ := mtsEnc(mw, int(r.config.WriteRate), mediaType)
|
||||||
r.encoder = append(r.encoder, e)
|
r.encoder = append(r.encoder, e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,8 +281,8 @@ func (r *Revid) setupPipeline(mtsEnc, flvEnc func(dst io.Writer, rate int) (io.W
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMtsEncoder(dst io.Writer, fps int) (io.Writer, error) {
|
func newMtsEncoder(dst io.Writer, writeRate, mediaType int) (io.Writer, error) {
|
||||||
e := mts.NewEncoder(dst, float64(fps), mts.Video)
|
e := mts.NewEncoder(dst, float64(writeRate), mediaType)
|
||||||
return e, nil
|
return e, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue