Skip to content

Commit

Permalink
SRS5: FFmpeg: Support build with FFmpeg native opus. v5.0.131 (ossrs#…
Browse files Browse the repository at this point in the history
  • Loading branch information
winlinvip committed Jan 6, 2023
1 parent ef53385 commit 3c6ade8
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 24 deletions.
6 changes: 6 additions & 0 deletions trunk/auto/auto_headers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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_H265 == YES ]]; then
srs_define_macro "SRS_H265" $SRS_AUTO_HEADERS_H
else
Expand Down
16 changes: 8 additions & 8 deletions trunk/auto/depends.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand All @@ -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"
Expand Down
9 changes: 9 additions & 0 deletions trunk/auto/options.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,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
Expand Down Expand Up @@ -165,6 +167,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)
--h265=on|off Whether build the HEVC(H.265) support. Default: $(value2switch $SRS_H265)
Expand Down Expand Up @@ -344,6 +347,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) ;;
--h265) SRS_H265=$(switch2value $value) ;;
--gb28181) SRS_GB28181=$(switch2value $value) ;;

Expand Down Expand Up @@ -505,6 +509,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
Expand Down Expand Up @@ -620,6 +628,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)"
Expand Down
12 changes: 9 additions & 3 deletions trunk/configure
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
1 change: 1 addition & 0 deletions trunk/doc/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,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
Expand Down
24 changes: 12 additions & 12 deletions trunk/src/app/srs_app_rtc_codec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion trunk/src/core/srs_core_version5.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@

#define VERSION_MAJOR 5
#define VERSION_MINOR 0
#define VERSION_REVISION 130
#define VERSION_REVISION 131

#endif

0 comments on commit 3c6ade8

Please sign in to comment.