Add support two channel PCM family audio #580
This commit is contained in:
+6
-1
@@ -130,8 +130,13 @@ func (c *Consumer) AddTrack(media *core.Media, _ *core.Codec, track *core.Receiv
|
|||||||
}
|
}
|
||||||
case core.CodecOpus, core.CodecMP3: // no changes
|
case core.CodecOpus, core.CodecMP3: // no changes
|
||||||
case core.CodecPCMA, core.CodecPCMU, core.CodecPCM, core.CodecPCML:
|
case core.CodecPCMA, core.CodecPCMU, core.CodecPCM, core.CodecPCML:
|
||||||
handler.Handler = pcm.FLACEncoder(track.Codec, handler.Handler)
|
|
||||||
codec.Name = core.CodecFLAC
|
codec.Name = core.CodecFLAC
|
||||||
|
if codec.Channels == 2 {
|
||||||
|
// hacky way for support two channels audio
|
||||||
|
codec.Channels = 1
|
||||||
|
codec.ClockRate *= 2
|
||||||
|
}
|
||||||
|
handler.Handler = pcm.FLACEncoder(track.Codec.Name, codec.ClockRate, handler.Handler)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
handler.Handler = nil
|
handler.Handler = nil
|
||||||
|
|||||||
+4
-8
@@ -48,13 +48,9 @@ func FLACHeader(magic bool, sampleRate uint32) []byte {
|
|||||||
var table8 *crc8.Table
|
var table8 *crc8.Table
|
||||||
var table16 *crc16.Table
|
var table16 *crc16.Table
|
||||||
|
|
||||||
func FLACEncoder(codec *core.Codec, handler core.HandlerFunc) core.HandlerFunc {
|
func FLACEncoder(codecName string, clockRate uint32, handler core.HandlerFunc) core.HandlerFunc {
|
||||||
if codec.Channels >= 2 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var sr byte
|
var sr byte
|
||||||
switch codec.ClockRate {
|
switch clockRate {
|
||||||
case 8000:
|
case 8000:
|
||||||
sr = 0b0100
|
sr = 0b0100
|
||||||
case 16000:
|
case 16000:
|
||||||
@@ -87,7 +83,7 @@ func FLACEncoder(codec *core.Codec, handler core.HandlerFunc) core.HandlerFunc {
|
|||||||
return func(packet *rtp.Packet) {
|
return func(packet *rtp.Packet) {
|
||||||
samples := uint16(len(packet.Payload))
|
samples := uint16(len(packet.Payload))
|
||||||
|
|
||||||
if codec.Name == core.CodecPCM || codec.Name == core.CodecPCML {
|
if codecName == core.CodecPCM || codecName == core.CodecPCML {
|
||||||
samples /= 2
|
samples /= 2
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +111,7 @@ func FLACEncoder(codec *core.Codec, handler core.HandlerFunc) core.HandlerFunc {
|
|||||||
n += 1
|
n += 1
|
||||||
|
|
||||||
// 3. Subframe
|
// 3. Subframe
|
||||||
switch codec.Name {
|
switch codecName {
|
||||||
case core.CodecPCMA:
|
case core.CodecPCMA:
|
||||||
for _, b := range packet.Payload {
|
for _, b := range packet.Payload {
|
||||||
s16 := PCMAtoPCM(b)
|
s16 := PCMAtoPCM(b)
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ import (
|
|||||||
func ResampleToG711(codec *core.Codec, sampleRate uint32, handler core.HandlerFunc) core.HandlerFunc {
|
func ResampleToG711(codec *core.Codec, sampleRate uint32, handler core.HandlerFunc) core.HandlerFunc {
|
||||||
n := float32(codec.ClockRate) / float32(sampleRate)
|
n := float32(codec.ClockRate) / float32(sampleRate)
|
||||||
|
|
||||||
|
if codec.Channels == 2 {
|
||||||
|
n *= 2 // hacky way for support two channels audio
|
||||||
|
}
|
||||||
|
|
||||||
switch codec.Name {
|
switch codec.Name {
|
||||||
case core.CodecPCMA:
|
case core.CodecPCMA:
|
||||||
return DownsampleByte(PCMAtoPCM, PCMtoPCMA, n, handler)
|
return DownsampleByte(PCMAtoPCM, PCMtoPCMA, n, handler)
|
||||||
|
|||||||
Reference in New Issue
Block a user