|
|
// Copyright 2022, 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 base
|
|
|
|
|
|
type (
|
|
|
AvPacketStreamAudioFormat int
|
|
|
AvPacketStreamVideoFormat int
|
|
|
)
|
|
|
|
|
|
const (
|
|
|
AvPacketStreamAudioFormatUnknown AvPacketStreamAudioFormat = 0
|
|
|
AvPacketStreamAudioFormatRawAac AvPacketStreamAudioFormat = 1
|
|
|
AvPacketStreamAudioFormatAdtsAac AvPacketStreamAudioFormat = 2
|
|
|
|
|
|
AvPacketStreamVideoFormatUnknown AvPacketStreamVideoFormat = 0
|
|
|
AvPacketStreamVideoFormatAvcc AvPacketStreamVideoFormat = 1
|
|
|
AvPacketStreamVideoFormatAnnexb AvPacketStreamVideoFormat = 2
|
|
|
)
|
|
|
|
|
|
type AvPacketStreamOption struct {
|
|
|
AudioFormat AvPacketStreamAudioFormat
|
|
|
VideoFormat AvPacketStreamVideoFormat // 视频流的格式,注意,不是指编码格式,而是编码格式确定后,流的格式
|
|
|
}
|
|
|
|
|
|
var DefaultApsOption = AvPacketStreamOption{
|
|
|
AudioFormat: AvPacketStreamAudioFormatRawAac,
|
|
|
VideoFormat: AvPacketStreamVideoFormatAvcc,
|
|
|
}
|
|
|
|
|
|
type IAvPacketStream interface {
|
|
|
// WithOption 修改配置项
|
|
|
//
|
|
|
// TODO(chef): [refactor] 重命名为WithAvPacketStreamOption 202301
|
|
|
//
|
|
|
WithOption(modOption func(option *AvPacketStreamOption))
|
|
|
|
|
|
// FeedAudioSpecificConfig 传入音频AAC的初始化数据
|
|
|
//
|
|
|
// @param asc:
|
|
|
//
|
|
|
// AudioSpecificConfig。含义可参考 aac.AscContext, aac.MakeAscWithAdtsHeader 等内容。
|
|
|
// 注意,调用 FeedAvPacket 传入AAC音频数据前,需要先调用 FeedAudioSpecificConfig。
|
|
|
// FeedAudioSpecificConfig 在最开始总共调用一次,后面就可以一直调用 FeedAvPacket
|
|
|
//
|
|
|
FeedAudioSpecificConfig(asc []byte) error
|
|
|
|
|
|
// FeedAvPacket
|
|
|
//
|
|
|
// @param packet:
|
|
|
//
|
|
|
// PayloadType: 类型,支持avc(h264),hevc(h265),aac
|
|
|
//
|
|
|
// Timestamp: 时间戳,单位毫秒。注意,是累计递增值,不是单个包的duration时长。
|
|
|
//
|
|
|
// Payload: 音视频数据,格式如下
|
|
|
//
|
|
|
// 如果是音频AAC,格式是裸数据,不需要adts头。
|
|
|
// 注意,调用 FeedAvPacket 传入AAC音频数据前,需要先调用 FeedAudioSpecificConfig。
|
|
|
// FeedAudioSpecificConfig 在最开始总共调用一次,后面就可以一直调用 FeedAvPacket
|
|
|
//
|
|
|
// 如果是视频,支持Avcc和Annexb两种格式。
|
|
|
// Avcc也即[<4字节长度 + nal>...],Annexb也即[<4字节start code 00 00 00 01 + nal>...]。
|
|
|
// 注意,sps和pps也通过 FeedAvPacket 传入。sps和pps可以单独调用 FeedAvPacket,也可以sps+pps+I帧组合在一起调用一次 FeedAvPacket
|
|
|
//
|
|
|
FeedAvPacket(packet AvPacket) error
|
|
|
}
|