// 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 }