From a27ce1d50f5bf6c98bdcec213beded77a2898205 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 6 Jan 2023 17:23:19 +0800 Subject: [PATCH] FFmpeg: Support build with FFmpeg native opus. v5.0.131 (#3140) --- trunk/auto/auto_headers.sh | 6 ++++++ trunk/auto/depends.sh | 16 ++++++++-------- trunk/auto/options.sh | 9 +++++++++ trunk/configure | 12 +++++++++--- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_rtc_codec.cpp | 24 ++++++++++++------------ trunk/src/core/srs_core_version5.hpp | 2 +- 7 files changed, 46 insertions(+), 24 deletions(-) diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh index 95c9d1f92..ca74deded 100755 --- a/trunk/auto/auto_headers.sh +++ b/trunk/auto/auto_headers.sh @@ -86,6 +86,12 @@ else srs_undefine_macro "SRS_FFMPEG_FIT" $SRS_AUTO_HEADERS_H fi +if [[ $SRS_FFMPEG_OPUS == YES ]]; then + srs_define_macro "SRS_FFMPEG_OPUS" $SRS_AUTO_HEADERS_H +else + srs_undefine_macro "SRS_FFMPEG_OPUS" $SRS_AUTO_HEADERS_H +fi + if [[ $SRS_SIMULATOR == YES ]]; then srs_define_macro "SRS_SIMULATOR" $SRS_AUTO_HEADERS_H else diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 8cffe5946..0e05c3a2c 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -528,7 +528,7 @@ fi # libopus, for WebRTC to transcode AAC with Opus. ##################################################################################### # For cross build, we use opus of FFmpeg, so we don't build the libopus. -if [[ $SRS_RTC == YES && $SRS_CROSS_BUILD != YES ]]; then +if [[ $SRS_RTC == YES && $SRS_FFMPEG_OPUS != YES ]]; then # Only build static libraries if no shared FFmpeg. if [[ $SRS_SHARED_FFMPEG == NO ]]; then OPUS_OPTIONS="--disable-shared --disable-doc" @@ -559,11 +559,11 @@ fi # ffmpeg-fit, for WebRTC to transcode AAC with Opus. ##################################################################################### if [[ $SRS_FFMPEG_FIT == YES ]]; then - if [[ $SRS_CROSS_BUILD == YES ]]; then - FFMPEG_CONFIGURE="./configure" - else - FFMPEG_CONFIGURE="env PKG_CONFIG_PATH=${SRS_DEPENDS_LIBS}/opus/lib/pkgconfig ./configure" + FFMPEG_CONFIGURE="env SRS_FFMPEG_FIT=on" + if [[ $SRS_FFMPEG_OPUS != YES ]]; then + FFMPEG_CONFIGURE="$FFMPEG_CONFIGURE PKG_CONFIG_PATH=${SRS_DEPENDS_LIBS}/opus/lib/pkgconfig" fi + FFMPEG_CONFIGURE="$FFMPEG_CONFIGURE ./configure" # Disable all features, note that there are still some options need to be disabled. FFMPEG_OPTIONS="--disable-everything" @@ -583,9 +583,9 @@ if [[ $SRS_FFMPEG_FIT == YES ]]; then FFMPEG_OPTIONS="$FFMPEG_OPTIONS --cross-prefix=$SRS_CROSS_BUILD_PREFIX" FFMPEG_OPTIONS="$FFMPEG_OPTIONS --cc=${SRS_TOOL_CC} --cxx=${SRS_TOOL_CXX} --ar=${SRS_TOOL_AR} --ld=${SRS_TOOL_LD}" fi - # For cross-build. - if [[ $SRS_CROSS_BUILD == YES ]]; then - # Note that the audio might be corrupted, if use FFmpeg native opus. + # For audio codec opus, use FFmpeg native one, or external libopus. + if [[ $SRS_FFMPEG_OPUS == YES ]]; then + # TODO: FIXME: Note that the audio might be corrupted, see https://github.com/ossrs/srs/issues/3140 FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-decoder=opus --enable-encoder=opus" else FFMPEG_OPTIONS="$FFMPEG_OPTIONS --enable-decoder=libopus --enable-encoder=libopus --enable-libopus" diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index cd3a3b8b1..368f62ba0 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -36,6 +36,8 @@ SRS_FFMPEG_STUB=NO SRS_FFMPEG_TOOL=NO # FFmpeg fit is the source code for RTC, to transcode audio or video in SRS. SRS_FFMPEG_FIT=RESERVED +# Whether use FFmpeg native opus codec for RTC. If not, use libopus instead. +SRS_FFMPEG_OPUS=NO # arguments SRS_PREFIX=/usr/local/srs SRS_DEFAULT_CONFIG=conf/srs.conf @@ -164,6 +166,7 @@ Features: --cxx11=on|off Whether enable the C++11. Default: $(value2switch $SRS_CXX11) --cxx14=on|off Whether enable the C++14. Default: $(value2switch $SRS_CXX14) --ffmpeg-fit=on|off Whether enable the FFmpeg fit(source code). Default: $(value2switch $SRS_FFMPEG_FIT) + --ffmpeg-opus=on|off Whether enable the FFmpeg native opus codec. Default: $(value2switch $SRS_FFMPEG_OPUS) --apm=on|off Whether enable cloud logging and APM(Application Performance Monitor). Default: $(value2switch $SRS_APM) --prefix= The absolute installation path. Default: $SRS_PREFIX @@ -342,6 +345,7 @@ function parse_user_option() { --generate-objs) SRS_GENERATE_OBJS=$(switch2value $value) ;; --single-thread) SRS_SINGLE_THREAD=$(switch2value $value) ;; --ffmpeg-fit) SRS_FFMPEG_FIT=$(switch2value $value) ;; + --ffmpeg-opus) SRS_FFMPEG_OPUS=$(switch2value $value) ;; --gb28181) SRS_GB28181=$(switch2value $value) ;; --cxx11) SRS_CXX11=$(switch2value $value) ;; @@ -502,6 +506,10 @@ function apply_auto_options() { if [[ $SRS_RTC == YES && $SRS_FFMPEG_FIT == RESERVED ]]; then SRS_FFMPEG_FIT=YES fi + if [[ $SRS_CROSS_BUILD == YES && $SRS_FFMPEG_OPUS != YES ]]; then + echo "Enable FFmpeg native opus for cross building" + SRS_FFMPEG_OPUS=YES + fi # Enable asan, but disable for Centos # @see https://github.com/ossrs/srs/issues/3347 @@ -616,6 +624,7 @@ function regenerate_options() { SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx14=$(value2switch $SRS_CXX14)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --backtrace=$(value2switch $SRS_BACKTRACE)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ffmpeg-fit=$(value2switch $SRS_FFMPEG_FIT)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ffmpeg-opus=$(value2switch $SRS_FFMPEG_OPUS)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --nasm=$(value2switch $SRS_NASM)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --srtp-nasm=$(value2switch $SRS_SRTP_ASM)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --clean=$(value2switch $SRS_CLEAN)" diff --git a/trunk/configure b/trunk/configure index dd197a05f..52a7711b4 100755 --- a/trunk/configure +++ b/trunk/configure @@ -156,11 +156,17 @@ fi # FFMPEG for WebRTC transcoding, such as aac to opus. if [[ $SRS_FFMPEG_FIT == YES ]]; then - LibFfmpegRoot="${SRS_OBJS}/ffmpeg/include"; LibFfmpegFile="${SRS_OBJS}/ffmpeg/lib/libavcodec.a ${SRS_OBJS}/ffmpeg/lib/libswresample.a ${SRS_OBJS}/ffmpeg/lib/libavutil.a" - if [[ $SRS_CROSS_BUILD != YES ]]; then + LibFfmpegRoot="${SRS_OBJS}/ffmpeg/include" + LibFfmpegFile="${SRS_OBJS}/ffmpeg/lib/libavcodec.a ${SRS_OBJS}/ffmpeg/lib/libswresample.a ${SRS_OBJS}/ffmpeg/lib/libavutil.a" + if [[ $SRS_FFMPEG_OPUS != YES ]]; then LibFfmpegFile="${LibFfmpegFile} ${SRS_OBJS}/opus/lib/libopus.a" fi - if [[ $SRS_SHARED_FFMPEG == YES ]]; then LibFfmpegFile="-L${SRS_OBJS}/ffmpeg/lib -lavcodec -lswresample -lavutil -L${SRS_OBJS}/opus/lib -lopus"; fi + if [[ $SRS_SHARED_FFMPEG == YES ]]; then + LibFfmpegFile="-L${SRS_OBJS}/ffmpeg/lib -lavcodec -lswresample -lavutil"; + if [[ $SRS_FFMPEG_OPUS != YES ]]; then + LibFfmpegFile="$LibFfmpegFile -L${SRS_OBJS}/opus/lib -lopus" + fi + fi fi # openssl-1.1.0e, for the RTMP complex handshake. diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index c51ce2a77..b74764461 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2023-01-05, FFmpeg: Support build with FFmpeg native opus. v5.0.131 (#3140) * v5.0, 2023-01-05, CORS: Refine HTTP CORS headers. v5.0.130 * v5.0, 2023-01-03, Add blackbox test for HLS and MP3 codec. v5.0.129 * v5.0, 2023-01-02, Merge [#3355](https://github.com/ossrs/srs/pull/3355): Test: Support blackbox test by FFmpeg. v5.0.128 diff --git a/trunk/src/app/srs_app_rtc_codec.cpp b/trunk/src/app/srs_app_rtc_codec.cpp index 2ca6bca8d..840ace525 100644 --- a/trunk/src/app/srs_app_rtc_codec.cpp +++ b/trunk/src/app/srs_app_rtc_codec.cpp @@ -17,12 +17,12 @@ static const AVCodec* srs_find_decoder_by_id(SrsAudioCodecId id) } else if (id == SrsAudioCodecIdMP3) { return avcodec_find_decoder_by_name("mp3"); } else if (id == SrsAudioCodecIdOpus) { - const AVCodec* codec = avcodec_find_decoder_by_name("libopus"); - if (!codec) { - // TODO: FIXME: Note that the audio might be corrupted, if use FFmpeg native opus. - codec = avcodec_find_decoder_by_name("opus"); - } - return codec; +#ifdef SRS_FFMPEG_OPUS + // TODO: FIXME: Note that the audio might be corrupted, see https://github.com/ossrs/srs/issues/3140 + return avcodec_find_decoder_by_name("opus"); +#else + return avcodec_find_decoder_by_name("libopus"); +#endif } return NULL; } @@ -32,12 +32,12 @@ static const AVCodec* srs_find_encoder_by_id(SrsAudioCodecId id) if (id == SrsAudioCodecIdAAC) { return avcodec_find_encoder_by_name("aac"); } else if (id == SrsAudioCodecIdOpus) { - const AVCodec* codec = avcodec_find_encoder_by_name("libopus"); - if (!codec) { - // TODO: FIXME: Note that the audio might be corrupted, if use FFmpeg native opus. - codec = avcodec_find_encoder_by_name("opus"); - } - return codec; +#ifdef SRS_FFMPEG_OPUS + // TODO: FIXME: Note that the audio might be corrupted, see https://github.com/ossrs/srs/issues/3140 + return avcodec_find_encoder_by_name("opus"); +#else + return avcodec_find_encoder_by_name("libopus"); +#endif } return NULL; } diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 5f47d0a71..021b485e2 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 130 +#define VERSION_REVISION 131 #endif