Skip to content

Commit 4bc6457

Browse files
committed
feat: #353 enhanced rtmp v2 audio(don't support mutli-channel)
1 parent e03136e commit 4bc6457

10 files changed

+439
-12
lines changed

libflv/include/flv-header.h

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ struct flv_audio_tag_header_t
3333
uint8_t bits; /// audio sample bits: 0-8 bit samples, 1-16-bit samples
3434
uint8_t channels; /// audio channel count: 0-Mono sound, 1-Stereo sound
3535
uint8_t avpacket; /// AAC only:FLV_SEQUENCE_HEADER/FLV_AVPACKET
36+
37+
uint8_t multitrack; /// enhanced rtmp v2, e.g. FLV_AUDIO_MULTI_TRACK_MANY_CODECS
38+
uint8_t channelorder; /// enhanced rtmp v2, valid on FLV_AUDIO_PACKET_TYPE_MULTICHANNEL_CONFIG
39+
uint32_t channelflags; /// enhanced rtmp v2, valid on FLV_AUDIO_PACKET_TYPE_MULTICHANNEL_CONFIG
40+
uint8_t channelmapping[8]; /// enhanced rtmp v2, valid on FLV_AUDIO_PACKET_TYPE_MULTICHANNEL_CONFIG
3641
};
3742

3843
struct flv_video_tag_header_t

libflv/include/flv-muxer.h

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ int flv_muxer_g711u(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t
3939
/// @param[in] data opus stream, first opus head, then opus samples
4040
int flv_muxer_opus(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts);
4141

42+
int flv_muxer_ac3(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts);
43+
int flv_muxer_eac3(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts);
44+
4245
/// @param[in] data h.264 annexb bitstream: H.264 start code + H.264 NALU, 0x0000000168...
4346
int flv_muxer_avc(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts);
4447

libflv/include/flv-proto.h

+35-4
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,21 @@
1111
#define FLV_AUDIO_ADPCM (1 << 4)
1212
#define FLV_AUDIO_MP3 (2 << 4)
1313
#define FLV_AUDIO_LLPCM (3 << 4) // Linear PCM, little endian
14+
#define FLV_AUDIO_FLAC (4 << 4) // Nellymoser16KMono -> FLAC(enhanced rtmp v2)
15+
#define FLV_AUDIO_EAC3 (5 << 4) // Nellymoser8KMono -> EAC3(enhanced rtmp v2)
16+
#define FLV_AUDIO_Nelly (6 << 4) // Nellymoser
1417
#define FLV_AUDIO_G711A (7 << 4) // G711 A-law
1518
#define FLV_AUDIO_G711U (8 << 4) // G711 mu-law
19+
#define FLV_AUDIO_FOURCC (9 << 4) // enhanced rtmp v2
1620
#define FLV_AUDIO_AAC (10 << 4)
1721
#define FLV_AUDIO_SPEEX (11 << 4)
22+
#define FLV_AUDIO_AC3 (12 << 4) // enhanced rtmp v2
1823
#define FLV_AUDIO_OPUS (13 << 4)
1924
#define FLV_AUDIO_MP3_8K (14 << 4) // MP3 8 kHz
2025
#define FLV_AUDIO_DEVIDE (15 << 4) // Device-specific sound
2126
#define FLV_AUDIO_ASC (0x1000 | FLV_AUDIO_AAC) // AudioSpecificConfig(ISO-14496-3)
22-
#define FLV_AUDIO_OPUS_HEAD (0x1100 | FLV_AUDIO_OPUS)// opus-codec.org
27+
#define FLV_AUDIO_OPUS_HEAD (0x1100 | FLV_AUDIO_OPUS) // opus-codec.org
28+
#define FLV_AUDIO_FLAC_HEAD (0x1200 | FLV_AUDIO_FLAC) // xiph.org/flac
2329

2430
// FLV Video Type
2531
#define FLV_VIDEO_H263 2 // Sorenson H.263
@@ -64,6 +70,13 @@ enum
6470
// note: PacketTypeSequenceStart and PacketTypeMPEG2TSSequenceStart
6571
// are mutually exclusive
6672
FLV_PACKET_TYPE_MPEG2TS_SEQUENCE_START = 5,
73+
74+
// Turns on video multitrack mode
75+
FLV_PACKET_TYPE_MULTITRACK = 6,
76+
77+
// audio
78+
FLV_AUDIO_PACKET_TYPE_MULTICHANNEL_CONFIG = 4,
79+
FLV_AUDIO_PACKET_TYPE_MULTITRACK = 5, // Turns on audio multitrack mode
6780
};
6881

6982
enum
@@ -95,11 +108,29 @@ enum
95108
FLV_SOUND_CHANNEL_STEREO = 1, // 2-channels
96109
};
97110

111+
// AvMultitrackType
112+
enum flv_audio_multi_track_e
113+
{
114+
FLV_AUDIO_MULTI_TRACK_ONE = 0, // OneTrack
115+
FLV_AUDIO_MULTI_TRACK_MANY = 1, // ManyTracks
116+
FLV_AUDIO_MULTI_TRACK_MANY_CODECS = 2, // ManyTracksManyCodecs
117+
118+
FLV_AUDIO_MULTI_TRACK_NONE = 255,
119+
};
120+
98121
#define FLV_VIDEO_FOURCC(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
99122

100-
#define FLV_VIDEO_FOURCC_AV1 FLV_VIDEO_FOURCC('a', 'v', '0', '1')
101123
#define FLV_VIDEO_FOURCC_VP9 FLV_VIDEO_FOURCC('v', 'p', '0', '9')
102-
#define FLV_VIDEO_FOURCC_HEVC FLV_VIDEO_FOURCC('h', 'v', 'c', '1')
103-
#define FLV_VIDEO_FOURCC_VVC FLV_VIDEO_FOURCC('v', 'v', 'c', '1')
124+
#define FLV_VIDEO_FOURCC_AV1 FLV_VIDEO_FOURCC('a', 'v', '0', '1')
125+
#define FLV_VIDEO_FOURCC_AVC FLV_VIDEO_FOURCC('a', 'v', 'c', '1') // H.264
126+
#define FLV_VIDEO_FOURCC_HEVC FLV_VIDEO_FOURCC('h', 'v', 'c', '1') // H.265
127+
#define FLV_VIDEO_FOURCC_VVC FLV_VIDEO_FOURCC('v', 'v', 'c', '1') // H.266
128+
129+
#define FLV_AUDIO_FOURCC_AC3 FLV_VIDEO_FOURCC('a', 'c', '-', '3') // AC-3/E-AC-3 - <https://en.wikipedia.org/wiki/Dolby_Digital>
130+
#define FLV_AUDIO_FOURCC_EAC3 FLV_VIDEO_FOURCC('e', 'c', '-', '3')
131+
#define FLV_AUDIO_FOURCC_OPUS FLV_VIDEO_FOURCC('O', 'p', 'u', 's') // Opus audio - <https://opus-codec.org/>
132+
#define FLV_AUDIO_FOURCC_MP3 FLV_VIDEO_FOURCC('.', 'm', 'p', '3') // Mp3 audio - <https://en.wikipedia.org/wiki/MP3>
133+
#define FLV_AUDIO_FOURCC_FLAC FLV_VIDEO_FOURCC('f', 'L', 'a', 'C') // Free Lossless Audio Codec - <https://xiph.org/flac/format.html>
134+
#define FLV_AUDIO_FOURCC_AAC FLV_VIDEO_FOURCC('m', 'p', '4', 'a') // Advanced Audio Coding - <https://en.wikipedia.org/wiki/Advanced_Audio_Coding>
104135

105136
#endif /* !_flv_proto_h_ */

libflv/include/xiph-flac.h

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef _xiph_flac_h_
2+
#define _xiph_flac_h_
3+
4+
#include <stddef.h>
5+
#include <stdint.h>
6+
7+
#if defined(__cplusplus)
8+
extern "C" {
9+
#endif
10+
11+
struct flac_streaminfo_t
12+
{
13+
uint16_t min_block_size; // in samples
14+
uint16_t max_block_size;
15+
uint32_t min_frame_size; // 24-bits, in bytes
16+
uint32_t max_frame_size;
17+
uint64_t sample_rate : 20; // 20-bits, [0, 655350Hz]
18+
uint64_t channels : 3; // (number of channels)-1, 3-bits, [1, 8]
19+
uint64_t bits_per_sample : 5; // (bits per sample)-1, 5-bits, [4, 32]
20+
uint64_t samples : 36; // total samples in stream
21+
uint8_t signature[16]; // MD5 signature of the unencoded audio data
22+
};
23+
24+
/// @return >0-ok, <=0-error
25+
int flac_streaminfo_save(const struct flac_streaminfo_t* flac, uint8_t* data, size_t bytes);
26+
/// @return >0-ok, <=0-error
27+
int flac_streaminfo_load(const uint8_t* data, size_t bytes, struct flac_streaminfo_t* flac);
28+
29+
#if defined(__cplusplus)
30+
}
31+
#endif
32+
#endif /* !_xiph_flac_h_ */

libflv/libflv.vcxproj

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
<ClInclude Include="include\opus-head.h" />
4040
<ClInclude Include="include\riff-acm.h" />
4141
<ClInclude Include="include\webm-vpx.h" />
42+
<ClInclude Include="include\xiph-flac.h" />
4243
</ItemGroup>
4344
<ItemGroup>
4445
<ClCompile Include="source\amf0.c" />
@@ -67,6 +68,7 @@
6768
<ClCompile Include="source\vvc-annexbtomp4.c" />
6869
<ClCompile Include="source\vvc-mp4toannexb.c" />
6970
<ClCompile Include="source\webm-vpx.c" />
71+
<ClCompile Include="source\xiph-flac.c" />
7072
</ItemGroup>
7173
<PropertyGroup Label="Globals">
7274
<ProjectGuid>{D5BA0BB6-0D84-48CB-8630-F617CB6DE375}</ProjectGuid>

libflv/libflv.vcxproj.filters

+6
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@
7575
<ClInclude Include="include\avswg-avs3.h">
7676
<Filter>Header Files</Filter>
7777
</ClInclude>
78+
<ClInclude Include="include\xiph-flac.h">
79+
<Filter>Header Files</Filter>
80+
</ClInclude>
7881
</ItemGroup>
7982
<ItemGroup>
8083
<ClCompile Include="source\flv-demuxer.c">
@@ -155,5 +158,8 @@
155158
<ClCompile Include="source\avswg-avs3.c">
156159
<Filter>Source Files</Filter>
157160
</ClCompile>
161+
<ClCompile Include="source\xiph-flac.c">
162+
<Filter>Source Files</Filter>
163+
</ClCompile>
158164
</ItemGroup>
159165
</Project>

libflv/source/flv-demuxer.c

+19-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "mpeg4-hevc.h"
77
#include "mpeg4-vvc.h"
88
#include "opus-head.h"
9+
#include "xiph-flac.h"
910
#include "aom-av1.h"
1011
#include "avswg-avs3.h"
1112
#include "amf0.h"
@@ -20,6 +21,7 @@ struct flv_demuxer_t
2021
{
2122
struct mpeg4_aac_t aac;
2223
struct opus_head_t opus;
24+
struct flac_streaminfo_t flac;
2325
} a;
2426

2527
union
@@ -101,7 +103,7 @@ static int flv_demuxer_audio(struct flv_demuxer_t* flv, const uint8_t* data, int
101103
mpeg4_aac_audio_specific_config_load(data + n, bytes - n, &flv->a.aac);
102104
return flv->handler(flv->param, FLV_AUDIO_ASC, data + n, bytes - n, timestamp, timestamp, 0);
103105
}
104-
else
106+
else if (FLV_AVPACKET == audio.avpacket)
105107
{
106108
if (0 != flv_demuxer_check_and_alloc(flv, bytes + 7 + 1 + flv->a.aac.npce))
107109
return -ENOMEM;
@@ -123,20 +125,31 @@ static int flv_demuxer_audio(struct flv_demuxer_t* flv, const uint8_t* data, int
123125
opus_head_load(data + n, bytes - n, &flv->a.opus);
124126
return flv->handler(flv->param, FLV_AUDIO_OPUS_HEAD, data + n, bytes - n, timestamp, timestamp, 0);
125127
}
126-
else
128+
else if (FLV_AVPACKET == audio.avpacket)
127129
{
128130
return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0);
129131
}
130132
}
131-
else if (FLV_AUDIO_MP3 == audio.codecid || FLV_AUDIO_MP3_8K == audio.codecid)
133+
else if (FLV_AUDIO_FLAC == audio.codecid)
132134
{
133-
return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0);
135+
if (FLV_SEQUENCE_HEADER == audio.avpacket)
136+
{
137+
flac_streaminfo_load(data + n, bytes - n, &flv->a.flac);
138+
return flv->handler(flv->param, FLV_AUDIO_FLAC_HEAD, data + n, bytes - n, timestamp, timestamp, 0);
139+
}
140+
else if (FLV_AVPACKET == audio.avpacket)
141+
{
142+
return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0);
143+
}
134144
}
135145
else
136146
{
137-
// Audio frame data
138-
return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0);
147+
// Audio frame data: mp3/ac-3/eac-3
148+
if (FLV_AVPACKET == audio.avpacket)
149+
return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0);
139150
}
151+
152+
return 0;
140153
}
141154

142155
static int flv_demuxer_video(struct flv_demuxer_t* flv, const uint8_t* data, int bytes, uint32_t timestamp)

0 commit comments

Comments
 (0)