From e77b570636475e2c3337503fd9916f3318d38bf7 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 17 Jan 2019 09:24:17 +0800 Subject: [PATCH] Add codec OPUS/HEVC to FLV --- trunk/src/kernel/srs_kernel_codec.cpp | 6 +++++- trunk/src/kernel/srs_kernel_codec.hpp | 4 ++++ trunk/src/kernel/srs_kernel_ts.cpp | 2 ++ trunk/src/libs/srs_librtmp.cpp | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_codec.cpp b/trunk/src/kernel/srs_kernel_codec.cpp index 3bf37d8d8..677bac639 100644 --- a/trunk/src/kernel/srs_kernel_codec.cpp +++ b/trunk/src/kernel/srs_kernel_codec.cpp @@ -41,6 +41,8 @@ string srs_video_codec_id2str(SrsVideoCodecId codec) case SrsVideoCodecIdOn2VP6: case SrsVideoCodecIdOn2VP6WithAlphaChannel: return "VP6"; + case SrsVideoCodecIdHEVC: + return "HEVC"; case SrsVideoCodecIdReserved: case SrsVideoCodecIdReserved1: case SrsVideoCodecIdReserved2: @@ -60,6 +62,8 @@ string srs_audio_codec_id2str(SrsAudioCodecId codec) return "AAC"; case SrsAudioCodecIdMP3: return "MP3"; + case SrsAudioCodecIdOpus: + return "Opus"; case SrsAudioCodecIdReserved1: case SrsAudioCodecIdLinearPCMPlatformEndian: case SrsAudioCodecIdADPCM: @@ -638,7 +642,7 @@ bool SrsFormat::is_aac_sequence_header() bool SrsFormat::is_avc_sequence_header() { - return vcodec && vcodec->id == SrsVideoCodecIdAVC + return vcodec && (vcodec->id == SrsVideoCodecIdAVC || vcodec->id == SrsVideoCodecIdHEVC) && video && video->avc_packet_type == SrsVideoAvcFrameTraitSequenceHeader; } diff --git a/trunk/src/kernel/srs_kernel_codec.hpp b/trunk/src/kernel/srs_kernel_codec.hpp index 408200336..3b7dc00a8 100644 --- a/trunk/src/kernel/srs_kernel_codec.hpp +++ b/trunk/src/kernel/srs_kernel_codec.hpp @@ -60,6 +60,8 @@ enum SrsVideoCodecId SrsVideoCodecIdOn2VP6WithAlphaChannel = 5, SrsVideoCodecIdScreenVideoVersion2 = 6, SrsVideoCodecIdAVC = 7, + // See page 79 at @doc https://github.com/CDN-Union/H265/blob/master/Document/video_file_format_spec_v10_1_ksyun_20170615.doc + SrsVideoCodecIdHEVC = 12, }; std::string srs_video_codec_id2str(SrsVideoCodecId codec); @@ -152,6 +154,8 @@ enum SrsAudioCodecId SrsAudioCodecIdReserved = 9, SrsAudioCodecIdAAC = 10, SrsAudioCodecIdSpeex = 11, + // For FLV, it's undefined, we define it as Opus for WebRTC. + SrsAudioCodecIdOpus = 13, SrsAudioCodecIdReservedMP3_8kHz = 14, SrsAudioCodecIdReservedDeviceSpecificSound = 15, }; diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index 0521808b3..26ab41841 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -320,6 +320,7 @@ srs_error_t SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsVi case SrsVideoCodecIdOn2VP6: case SrsVideoCodecIdOn2VP6WithAlphaChannel: case SrsVideoCodecIdScreenVideoVersion2: + case SrsVideoCodecIdHEVC: vs = SrsTsStreamReserved; break; } @@ -348,6 +349,7 @@ srs_error_t SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsVi case SrsAudioCodecIdSpeex: case SrsAudioCodecIdReservedMP3_8kHz: case SrsAudioCodecIdReservedDeviceSpecificSound: + case SrsAudioCodecIdOpus: as = SrsTsStreamReserved; break; } diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index 28c53981f..53d5193d1 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -1666,7 +1666,7 @@ int srs_mp4_to_flv_tag(srs_mp4_t mp4, srs_mp4_sample_t* s, char* type, uint32_t* // E.4.3.1 VIDEODATA, flv_v10_1.pdf, page 5 p.write_1bytes(uint8_t(s->frame_type<<4) | uint8_t(s->codec)); - if (s->codec == SrsVideoCodecIdAVC) { + if (s->codec == SrsVideoCodecIdAVC || s->codec == SrsVideoCodecIdHEVC) { *type = SRS_RTMP_TYPE_VIDEO; p.write_1bytes(uint8_t(s->frame_trait == (uint16_t)SrsVideoAvcFrameTraitSequenceHeader? 0:1));