You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/app/demo/flvfile2es/flvfile2es.go

87 lines
1.8 KiB
Go

// Copyright 2019, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package main
import (
"flag"
"io"
"os"
"github.com/q191201771/lal/pkg/avc"
"github.com/q191201771/lal/pkg/aac"
"github.com/q191201771/lal/pkg/httpflv"
"github.com/q191201771/naza/pkg/nazalog"
)
// 将本地FLV文件分离成H264/AVC和AAC的ES流文件
//
// TODO chef 做HEVC的支持
func main() {
var err error
flvFileName, aacFileName, avcFileName := parseFlag()
var ffr httpflv.FLVFileReader
err = ffr.Open(flvFileName)
nazalog.Assert(nil, err)
defer ffr.Dispose()
nazalog.Infof("open flv file succ.")
afp, err := os.Create(aacFileName)
nazalog.Assert(nil, err)
defer afp.Close()
nazalog.Infof("open es aac file succ.")
vfp, err := os.Create(avcFileName)
nazalog.Assert(nil, err)
defer vfp.Close()
nazalog.Infof("open es h264 file succ.")
var adts aac.ADTS
for {
tag, err := ffr.ReadTag()
if err == io.EOF {
nazalog.Infof("EOF.")
break
}
nazalog.Assert(nil, err)
payload := tag.Payload()
switch tag.Header.Type {
case httpflv.TagTypeAudio:
if payload[1] == 0 {
err = adts.InitWithAACAudioSpecificConfig(payload[2:])
nazalog.Assert(nil, err)
}
d, err := adts.CalcADTSHeader(uint16(len(payload) - 2))
nazalog.Assert(nil, err)
_, _ = afp.Write(d)
_, _ = afp.Write(payload[2:])
case httpflv.TagTypeVideo:
_ = avc.CaptureAVCC2AnnexB(vfp, payload)
}
}
}
func parseFlag() (string, string, string) {
flv := flag.String("i", "", "specify flv file")
a := flag.String("a", "", "specify es aac file")
v := flag.String("v", "", "specify es h264 file")
flag.Parse()
if *flv == "" || *a == "" || *v == "" {
flag.Usage()
os.Exit(1)
}
return *flv, *a, *v
}