在mpegtsenc.c的
mpegts_write_pmt函数中,switch(st->codec->codec_id)的case中,添加如下代码
case AV_CODEC_ID_PCM_MULAW:
stream_type = 0x91;
break;
case AV_CODEC_ID_PCM_ALAW:
stream_type = 0x90;
break;
注意该流的定义与mpeg.c中的es_type是一致的,实际上这是mpeg中对mulaw和alaw的流类型定义关键字。这个关键字在后面还需要写到流中,在mpegtsenc.c中查找
else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
(st->codec->codec_id == AV_CODEC_ID_MP2 ||
st->codec->codec_id == AV_CODEC_ID_MP3 ||
st->codec->codec_id == AV_CODEC_ID_AAC)) {
改为
else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
(st->codec->codec_id == AV_CODEC_ID_MP2 ||
st->codec->codec_id == AV_CODEC_ID_MP3 ||
st->codec->codec_id == AV_CODEC_ID_AAC ||
st->codec->codec_id == AV_CODEC_ID_PCM_MULAW ||
st->codec->codec_id == AV_CODEC_ID_PCM_ALAW)) {
这段代码是在写入音频流关键字的判断
解码部分需要修改mprgts.c,修改流类型定义如下
上面的红字部分是添加的内容,注意 HDMV_types中已经有了0x90的定义。static const StreamType ISO_types[] = {{ 0x01, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },{ 0x02, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },{ 0x03, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3 },{ 0x04, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3 },{ 0x0f, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC },{ 0x10, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG4 },/* Makito encoder sets stream type 0x11 for AAC,* so auto-detect LOAS/LATM instead of hardcoding it. */#if !CONFIG_LOAS_DEMUXER{ 0x11, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC_LATM }, /* LATM syntax */#endif{ 0x1b, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_H264 },{ 0x24, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },{ 0x42, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_CAVS },{ 0xd1, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },{ 0xea, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },{ 0x90, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_ALAW },{ 0x91, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_MULAW },{ 0 },};
static const StreamType HDMV_types[] = {{ 0x80, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_BLURAY },{ 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },{ 0x82, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },{ 0x83, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_TRUEHD },{ 0x84, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },{ 0x85, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD */{ 0x86, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD MASTER*/{ 0xa1, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC3 Secondary Audio */{ 0xa2, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS Express Secondary Audio */{ 0x90, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_HDMV_PGS_SUBTITLE },{ 0x91, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_MULAW },{ 0 },};
/* ATSC ? */static const StreamType MISC_types[] = {{ 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },{ 0x8a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },{ 0x90, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_ALAW },{ 0x91, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_MULAW },{ 0 },};
static const StreamType REGD_types[] = {{ MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },{ MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },{ MKTAG('A', 'L', 'A', 'W'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_ALAW},{ MKTAG('U', 'L', 'A', 'W'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_MULAW},{ MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },{ MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },{ MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },{ MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },{ MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC },{ MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },{ MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },{ 0 },};
static const StreamType METADATA_types[] = {{ MKTAG('K','L','V','A'), AVMEDIA_TYPE_DATA, AV_CODEC_ID_SMPTE_KLV },{ MKTAG('I','D','3',' '), AVMEDIA_TYPE_DATA, AV_CODEC_ID_TIMED_ID3 },{ 0 },};
/* descriptor present */static const StreamType DESC_types[] = {{ 0x6a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 }, /* AC-3 descriptor */{ 0x7a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC-3 descriptor */{ 0x7b, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },{ 0x56, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_TELETEXT },{ 0x59, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */{ 0x90, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_ALAW },{ 0x91, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_MULAW },{ 0 },};
修改定义后,还需要在对law格式音频设置声音参数,修改mpegts_find_stream_type函数如下:
红色部分是添加内容static void mpegts_find_stream_type(AVStream *st,uint32_t stream_type,const StreamType *types){if (avcodec_is_open(st->codec)) {av_log(NULL, AV_LOG_DEBUG, "cannot set stream info, codec is open\n");return;}
for (; types->stream_type; types++)if (stream_type == types->stream_type) {st->codec->codec_type = types->codec_type;st->codec->codec_id = types->codec_id;if (st->codec->codec_id == AV_CODEC_ID_PCM_MULAW || st->codec->codec_id == AV_CODEC_ID_PCM_ALAW){st->codec->channels = 1;st->codec->channel_layout = AV_CH_LAYOUT_MONO;st->codec->sample_rate = 8000;}st->request_probe = 0;return;}}