can extract mp4aConf
This commit is contained in:
parent
3b4f49126d
commit
37fe5058b4
@ -167,6 +167,26 @@ var atoms = {
|
|||||||
mp4aDesc: {
|
mp4aDesc: {
|
||||||
cc4: 'mp4a',
|
cc4: 'mp4a',
|
||||||
fields: [
|
fields: [
|
||||||
|
['_', '[6]byte'],
|
||||||
|
['dataRefIdx', 'int16'],
|
||||||
|
['version', 'int16'],
|
||||||
|
['revisionLevel', 'int16'],
|
||||||
|
['vendor', 'int32'],
|
||||||
|
['numberOfChannels', 'int16'],
|
||||||
|
['sampleSize', 'int16'],
|
||||||
|
['compressionId', 'int16'],
|
||||||
|
['_', 'int16'],
|
||||||
|
['sampleRate', 'Fixed32'],
|
||||||
|
['$atoms', [
|
||||||
|
['conf', '*elemStreamDesc'],
|
||||||
|
]],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
|
||||||
|
elemStreamDesc: {
|
||||||
|
cc4: 'esds',
|
||||||
|
fields: [
|
||||||
|
['version', 'int32'],
|
||||||
['data', '[]byte'],
|
['data', '[]byte'],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
126
atom/struct.go
126
atom/struct.go
@ -984,15 +984,69 @@ func WriteSampleDesc(w io.WriteSeeker, self *SampleDesc) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Mp4aDesc struct {
|
type Mp4aDesc struct {
|
||||||
Data []byte
|
DataRefIdx int
|
||||||
|
Version int
|
||||||
|
RevisionLevel int
|
||||||
|
Vendor int
|
||||||
|
NumberOfChannels int
|
||||||
|
SampleSize int
|
||||||
|
CompressionId int
|
||||||
|
SampleRate Fixed
|
||||||
|
Conf *ElemStreamDesc
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadMp4aDesc(r *io.LimitedReader) (res *Mp4aDesc, err error) {
|
func ReadMp4aDesc(r *io.LimitedReader) (res *Mp4aDesc, err error) {
|
||||||
|
|
||||||
self := &Mp4aDesc{}
|
self := &Mp4aDesc{}
|
||||||
if self.Data, err = ReadBytes(r, int(r.N)); err != nil {
|
if _, err = ReadDummy(r, 6); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if self.DataRefIdx, err = ReadInt(r, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.Version, err = ReadInt(r, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.RevisionLevel, err = ReadInt(r, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.Vendor, err = ReadInt(r, 4); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.NumberOfChannels, err = ReadInt(r, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.SampleSize, err = ReadInt(r, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.CompressionId, err = ReadInt(r, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, err = ReadDummy(r, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.SampleRate, err = ReadFixed(r, 4); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for r.N > 0 {
|
||||||
|
var cc4 string
|
||||||
|
var ar *io.LimitedReader
|
||||||
|
if ar, cc4, err = ReadAtomHeader(r, ""); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch cc4 {
|
||||||
|
case "esds":
|
||||||
|
{
|
||||||
|
if self.Conf, err = ReadElemStreamDesc(ar); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if _, err = ReadDummy(ar, int(ar.N)); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
res = self
|
res = self
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1003,6 +1057,74 @@ func WriteMp4aDesc(w io.WriteSeeker, self *Mp4aDesc) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
w = aw
|
w = aw
|
||||||
|
if err = WriteDummy(w, 6); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteInt(w, self.DataRefIdx, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteInt(w, self.Version, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteInt(w, self.RevisionLevel, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteInt(w, self.Vendor, 4); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteInt(w, self.NumberOfChannels, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteInt(w, self.SampleSize, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteInt(w, self.CompressionId, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteDummy(w, 2); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = WriteFixed(w, self.SampleRate, 4); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.Conf != nil {
|
||||||
|
if err = WriteElemStreamDesc(w, self.Conf); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err = aw.Close(); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type ElemStreamDesc struct {
|
||||||
|
Version int
|
||||||
|
Data []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadElemStreamDesc(r *io.LimitedReader) (res *ElemStreamDesc, err error) {
|
||||||
|
|
||||||
|
self := &ElemStreamDesc{}
|
||||||
|
if self.Version, err = ReadInt(r, 4); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if self.Data, err = ReadBytes(r, int(r.N)); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res = self
|
||||||
|
return
|
||||||
|
}
|
||||||
|
func WriteElemStreamDesc(w io.WriteSeeker, self *ElemStreamDesc) (err error) {
|
||||||
|
|
||||||
|
var aw *Writer
|
||||||
|
if aw, err = WriteAtomHeader(w, "esds"); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w = aw
|
||||||
|
if err = WriteInt(w, self.Version, 4); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
if err = WriteBytes(w, self.Data, len(self.Data)); err != nil {
|
if err = WriteBytes(w, self.Data, len(self.Data)); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -3,13 +3,19 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
mp4 "./.."
|
mp4 "./.."
|
||||||
|
"flag"
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if _, err := mp4.Open("mid.mp4"); err != nil {
|
testconv := flag.Bool("testconv", false, "")
|
||||||
log.Println(err)
|
flag.Parse()
|
||||||
return
|
|
||||||
|
if *testconv {
|
||||||
|
if _, err := mp4.TestConvert(flag.Arg(0)); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
mp4.go
4
mp4.go
@ -64,13 +64,11 @@ func changeMoov(moov *atom.Movie) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
if mp4a := desc.Mp4aDesc; mp4a != nil {
|
if mp4a := desc.Mp4aDesc; mp4a != nil {
|
||||||
if conf := mp4a.Conf; conf != nil {
|
if conf := mp4a.Conf; conf != nil {
|
||||||
log.Println("mp4a", hex.Dump(conf.Data))
|
log.Println("mp4a", hex.Dump(conf.Data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,7 +76,7 @@ func changeMoov(moov *atom.Movie) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Open(filename string) (file *File, err error) {
|
func TestConvert(filename string) (file *File, err error) {
|
||||||
var osfile *os.File
|
var osfile *os.File
|
||||||
if osfile, err = os.Open(filename); err != nil {
|
if osfile, err = os.Open(filename); err != nil {
|
||||||
return
|
return
|
||||||
|
Loading…
x
Reference in New Issue
Block a user