fix pmt ES Info length field reserved value, cause quicktime cant play
This commit is contained in:
parent
a3225ee3df
commit
ff9f22f46d
62
writer.go
62
writer.go
@ -7,7 +7,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
)
|
)
|
||||||
|
|
||||||
const DebugWriter = true
|
const DebugWriter = false
|
||||||
|
|
||||||
func WriteUInt64(w io.Writer, val uint64, n int) (err error) {
|
func WriteUInt64(w io.Writer, val uint64, n int) (err error) {
|
||||||
var b [8]byte
|
var b [8]byte
|
||||||
@ -447,7 +447,7 @@ func WritePMT(w io.Writer, self PMT) (err error) {
|
|||||||
|
|
||||||
// Reserved(6)
|
// Reserved(6)
|
||||||
// ES Info length length(10)
|
// ES Info length length(10)
|
||||||
if err = WriteUInt(w, uint(bw.Len())|0x3f<<10, 2); err != nil {
|
if err = WriteUInt(w, uint(bw.Len())|0x3c<<10, 2); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -550,37 +550,6 @@ func (self *SimpleH264Writer) prepare() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *SimpleH264Writer) writeData(data io.ReadSeeker, duration int) (err error) {
|
|
||||||
pes := PESHeader{
|
|
||||||
StreamId: StreamIdH264,
|
|
||||||
PTS: self.pts,
|
|
||||||
}
|
|
||||||
self.tsw.PCR = self.pcr
|
|
||||||
|
|
||||||
self.pts += uint64(duration)*PTS_HZ/uint64(self.TimeScale)
|
|
||||||
self.pcr += uint64(duration)*PCR_HZ/uint64(self.TimeScale)
|
|
||||||
|
|
||||||
bw := &bytes.Buffer{}
|
|
||||||
if err = WritePES(bw, pes, data); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err = self.tsw.Write(bw.Bytes(), false); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *SimpleH264Writer) writeNALUs(nalus [][]byte, duration int) (err error) {
|
|
||||||
readers := []io.ReadSeeker{}
|
|
||||||
for _, nalu := range nalus {
|
|
||||||
startCode := bytes.NewReader([]byte{0,0,1})
|
|
||||||
readers = append(readers, startCode)
|
|
||||||
readers = append(readers, bytes.NewReader(nalu))
|
|
||||||
}
|
|
||||||
return self.writeData(&multiReadSeeker{readers: readers}, duration)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (self *SimpleH264Writer) WriteNALU(sync bool, duration int, nalu []byte) (err error) {
|
func (self *SimpleH264Writer) WriteNALU(sync bool, duration int, nalu []byte) (err error) {
|
||||||
nalus := [][]byte{}
|
nalus := [][]byte{}
|
||||||
|
|
||||||
@ -595,6 +564,31 @@ func (self *SimpleH264Writer) WriteNALU(sync bool, duration int, nalu []byte) (e
|
|||||||
|
|
||||||
nalus = append(nalus, nalu)
|
nalus = append(nalus, nalu)
|
||||||
|
|
||||||
return self.writeNALUs(nalus, duration)
|
readers := []io.ReadSeeker{}
|
||||||
|
for _, nalu := range nalus {
|
||||||
|
startCode := bytes.NewReader([]byte{0,0,1})
|
||||||
|
readers = append(readers, startCode)
|
||||||
|
readers = append(readers, bytes.NewReader(nalu))
|
||||||
|
}
|
||||||
|
data := &multiReadSeeker{readers: readers}
|
||||||
|
|
||||||
|
pes := PESHeader{
|
||||||
|
StreamId: StreamIdH264,
|
||||||
|
PTS: self.pts,
|
||||||
|
}
|
||||||
|
self.tsw.PCR = self.pcr
|
||||||
|
|
||||||
|
self.pts += uint64(duration)*PTS_HZ/uint64(self.TimeScale)
|
||||||
|
self.pcr += uint64(duration)*PCR_HZ/uint64(self.TimeScale)
|
||||||
|
|
||||||
|
bw := &bytes.Buffer{}
|
||||||
|
if err = WritePES(bw, pes, data); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = self.tsw.Write(bw.Bytes(), sync); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user