diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 677bac639..40143335e 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -89,6 +89,11 @@ string srs_audio_sample_rate2str(SrsAudioSampleRate v) case SrsAudioSampleRate11025: return "11025"; case SrsAudioSampleRate22050: return "22050"; case SrsAudioSampleRate44100: return "44100"; + case SrsAudioSampleRateNB8kHz: return "NB8kHz"; + case SrsAudioSampleRateMB12kHz: return "MB12kHz"; + case SrsAudioSampleRateWB16kHz: return "WB16kHz"; + case SrsAudioSampleRateSWB24kHz: return "SWB24kHz"; + case SrsAudioSampleRateFB48kHz: return "FB48kHz"; default: return "Other"; } } diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 3b7dc00a8..214411208 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -193,13 +193,23 @@ enum SrsAudioAacFrameTrait enum SrsAudioSampleRate { // set to the max value to reserved, for array map. - SrsAudioSampleRateReserved = 4, - SrsAudioSampleRateForbidden = 4, + SrsAudioSampleRateReserved = 0xff, + SrsAudioSampleRateForbidden = 0xff, + // For FLV, only support 5, 11, 22, 44KHz sampling rate. SrsAudioSampleRate5512 = 0, SrsAudioSampleRate11025 = 1, SrsAudioSampleRate22050 = 2, SrsAudioSampleRate44100 = 3, + + // For Opus, support 8, 12, 16, 24, 48KHz + // We will write a UINT8 sampling rate after FLV audio tag header. + // @doc https://tools.ietf.org/html/rfc6716#section-2 + SrsAudioSampleRateNB8kHz = 8, // NB (narrowband) + SrsAudioSampleRateMB12kHz = 12, // MB (medium-band) + SrsAudioSampleRateWB16kHz = 16, // WB (wideband) + SrsAudioSampleRateSWB24kHz = 24, // SWB (super-wideband) + SrsAudioSampleRateFB48kHz = 48, // FB (fullband) }; std::string srs_audio_sample_rate2str(SrsAudioSampleRate v); diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index 53d5193d1..1880ae0e4 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -2354,7 +2354,7 @@ char srs_utils_flv_audio_sound_format(char* data, int size) uint8_t sound_format = data[0]; sound_format = (sound_format >> 4) & 0x0f; - if (sound_format > 15 || sound_format == 12 || sound_format == 13) { + if (sound_format > 15 || sound_format == 12) { return -1; } @@ -2363,13 +2363,19 @@ char srs_utils_flv_audio_sound_format(char* data, int size) char srs_utils_flv_audio_sound_rate(char* data, int size) { - if (size < 1) { + if (size < 2) { return -1; } uint8_t sound_rate = data[0]; sound_rate = (sound_rate >> 2) & 0x03; + // For Opus, the first UINT8 is sampling rate. + uint8_t sound_format = (data[0] >> 4) & 0x0f; + if (sound_format == 13) { + sound_rate = data[1]; + } + return sound_rate; } @@ -2519,6 +2525,7 @@ const char* srs_human_flv_audio_sound_format2string(char sound_format) static const char* aac = "AAC"; static const char* speex = "Speex"; static const char* mp3_8khz = "MP3KHz8"; + static const char* opus = "Opus"; static const char* device_specific = "DeviceSpecific"; static const char* unknown = "Unknown"; @@ -2535,6 +2542,7 @@ const char* srs_human_flv_audio_sound_format2string(char sound_format) case 9: return reserved; case 10: return aac; case 11: return speex; + case 13: return opus; case 14: return mp3_8khz; case 15: return device_specific; default: return unknown; @@ -2551,11 +2559,26 @@ const char* srs_human_flv_audio_sound_rate2string(char sound_rate) static const char* khz_44 = "44KHz"; static const char* unknown = "Unknown"; + // For Opus, support 8, 12, 16, 24, 48KHz + // We will write a UINT8 sampling rate after FLV audio tag header. + // @doc https://tools.ietf.org/html/rfc6716#section-2 + static const char* NB8kHz = "NB8kHz"; + static const char* MB12kHz = "MB12kHz"; + static const char* WB16kHz = "WB16kHz"; + static const char* SWB24kHz = "SWB24kHz"; + static const char* FB48kHz = "FB48kHz"; + switch (sound_rate) { case 0: return khz_5_5; case 1: return khz_11; case 2: return khz_22; case 3: return khz_44; + // For Opus, support 8, 12, 16, 24, 48KHz + case 8: return NB8kHz; + case 12: return MB12kHz; + case 16: return WB16kHz; + case 24: return SWB24kHz; + case 48: return FB48kHz; default: return unknown; }