mediasoup-demo-android输出硬编码H264流
修改库:libmediasoupclient (v3) 3.2.0diff --git a/CMakeLists.txt b/CMakeLists.txtindex 70f0a0b..aa62c91 100644--- a/CMakeLists.txt+++ b/CMakeLists.txt@@ -74,6 +74,7 @@ set(src/sdp/MediaSection.cppsrc/sdp/
·
硬编码可以和网页互通,硬解码不通,目前业务没用到
修改库:
libmediasoupclient (v3) 3.2.0
其中 SendTransport::ProduceData方法编译不过注掉就行。
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 70f0a0b..aa62c91 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -74,6 +74,7 @@ set(
src/sdp/MediaSection.cpp
src/sdp/RemoteSdp.cpp
src/sdp/Utils.cpp
+ src/AndroidHardwareCodec.cpp
include/Consumer.hpp
include/Device.hpp
include/Handler.hpp
@@ -88,6 +89,7 @@ set(
include/sdp/MediaSection.hpp
include/sdp/RemoteSdp.hpp
include/sdp/Utils.hpp
+ include/AndroidHardwareCodec.hpp
)
# Create target.
@@ -128,10 +130,21 @@ target_include_directories(${PROJECT_NAME} PUBLIC
)
# Public (interface) dependencies.
-target_link_libraries(${PROJECT_NAME} PUBLIC
- sdptransform
- ${LIBWEBRTC_BINARY_PATH}/libwebrtc${CMAKE_STATIC_LIBRARY_SUFFIX}
-)
+if("${ANDROID_ABI}" STREQUAL "")
+ target_link_libraries(${PROJECT_NAME} PUBLIC
+ sdptransform
+ ${LIBWEBRTC_BINARY_PATH}/libwebrtc${CMAKE_STATIC_LIBRARY_SUFFIX}
+ )
+else()
+ # Add '-whole-archive' to keep symbols from peerconnection_jni.
+ # https://stackoverflow.com/a/5687860/2085408
+ SET (webrtc -Wl,--whole-archive ${LIBWEBRTC_BINARY_PATH}/${ANDROID_ABI}/libwebrtc${CMAKE_STATIC_LIBRARY_SUFFIX} -Wl,--no-whole-archive)
+
+ target_link_libraries(${PROJECT_NAME} PUBLIC
+ sdptransform
+ ${webrtc}
+ )
+endif()
# Compile definitions for libwebrtc.
target_compile_definitions(${PROJECT_NAME} PUBLIC
diff --git a/src/PeerConnection.cpp b/src/PeerConnection.cpp
index 849db1f..4d157d3 100644
--- a/src/PeerConnection.cpp
+++ b/src/PeerConnection.cpp
@@ -11,6 +11,10 @@
#include <api/video_codecs/builtin_video_encoder_factory.h>
#include <rtc_base/ssl_adapter.h>
+#ifdef __ANDROID__
+#include "AndroidHardwareCodec.hpp"
+#endif
+
using json = nlohmann::json;
namespace mediasoupclient
@@ -63,6 +67,7 @@ namespace mediasoupclient
PeerConnection::PrivateListener* privateListener, const PeerConnection::Options* options)
{
MSC_TRACE();
+ rtc::LogMessage::LogToDebug(rtc::LS_INFO);
webrtc::PeerConnectionInterface::RTCConfiguration config;
@@ -97,8 +102,13 @@ namespace mediasoupclient
nullptr /*default_adm*/,
webrtc::CreateBuiltinAudioEncoderFactory(),
webrtc::CreateBuiltinAudioDecoderFactory(),
+#ifdef __ANDROID__
+ android_hardware::CreateAndroidEncoderFactory(),
+ android_hardware::CreateAndroidDecoderFactory(),
+#else
webrtc::CreateBuiltinVideoEncoderFactory(),
webrtc::CreateBuiltinVideoDecoderFactory(),
+#endif
nullptr /*audio_mixer*/,
nullptr /*audio_processing*/);
}
抄代码webrtc-checkout\src\modules\video_coding\codecs\test\android_codec_factory_helper.x
AndroidHardwareCodec.hpp
#ifdef __ANDROID__
#ifndef __ANDROID_HARDWARE_CODEC_H__
#define __ANDROID_HARDWARE_CODEC_H__
#include <memory>
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
using namespace webrtc;
#define ANDROID_HW_SDK_VERSION_STRING "sdk_version"
#define ANDROID_HW_PHONE_MODEL_STRING "phone_model"
#define ANDROID_HW_CHIP_NAME_STRING "chip_name"
namespace android_hardware
{
std::unique_ptr<VideoEncoderFactory> CreateAndroidEncoderFactory();
std::unique_ptr<VideoDecoderFactory> CreateAndroidDecoderFactory();
} // namespace android_hardware
#endif /* android_hardware_codec_h */
#endif
AndroidHardwareCodec.cpp
#ifdef __ANDROID__
#include <pthread.h>
#include <memory>
#include <map>
#include <jni.h>
#include "rtc_base/checks.h"
#include "rtc_base/ignore_wundef.h"
#include "absl/strings/match.h"
#include "media/base/codec.h"
#include "api/video_codecs/sdp_video_format.h"
#include "sdk/android/native_api/base/init.h"
#include "sdk/android/native_api/codecs/wrapper.h"
#include "sdk/android/native_api/jni/class_loader.h"
#include "sdk/android/native_api/jni/jvm.h"
#include "sdk/android/native_api/jni/scoped_java_ref.h"
#include "AndroidHardwareCodec.hpp"
using namespace webrtc;
namespace android_hardware
{
static std::string g_currentAndroidHwInfo = "";
std::unique_ptr<VideoEncoderFactory> CreateAndroidEncoderFactory()
{
JNIEnv* env = AttachCurrentThreadIfNeeded();
ScopedJavaLocalRef<jclass> factory_class =
GetClass(env, "org/webrtc/HardwareVideoEncoderFactory");
jmethodID factory_constructor = env->GetMethodID(
factory_class.obj(), "<init>", "(Lorg/webrtc/EglBase$Context;ZZ)V");
ScopedJavaLocalRef<jobject> factory_object(
env, env->NewObject(factory_class.obj(), factory_constructor,
nullptr /* shared_context */,
false /* enable_intel_vp8_encoder */,
true /* enable_h264_high_profile */));
return JavaToNativeVideoEncoderFactory(env, factory_object.obj());
}
std::unique_ptr<VideoDecoderFactory> CreateAndroidDecoderFactory()
{
JNIEnv* env = AttachCurrentThreadIfNeeded();
ScopedJavaLocalRef<jclass> factory_class =
GetClass(env, "org/webrtc/HardwareVideoDecoderFactory");
jmethodID factory_constructor = env->GetMethodID(
factory_class.obj(), "<init>", "(Lorg/webrtc/EglBase$Context;)V");
ScopedJavaLocalRef<jobject> factory_object(
env, env->NewObject(factory_class.obj(), factory_constructor,
nullptr /* shared_context */));
return JavaToNativeVideoDecoderFactory(env, factory_object.obj());
}
} // namespace android_hardware
#endif
webrtc m84 -------4147
diff --git a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java b/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
index 8fe8b36909..fe72eafd7c 100644
--- a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
+++ b/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
@@ -102,10 +102,10 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
}
String codecName = info.getName();
- String mime = type.mimeType();
- Integer surfaceColorFormat = MediaCodecUtils.selectColorFormat(
+ String mime = type.mimeType(); //wzw200
+ Integer surfaceColorFormat = MediaCodecUtils.selectColorFormat(codecName, true,
MediaCodecUtils.TEXTURE_COLOR_FORMATS, info.getCapabilitiesForType(mime));
- Integer yuvColorFormat = MediaCodecUtils.selectColorFormat(
+ Integer yuvColorFormat = MediaCodecUtils.selectColorFormat(codecName, true,
MediaCodecUtils.ENCODER_COLOR_FORMATS, info.getCapabilitiesForType(mime));
if (type == VideoCodecMimeType.H264) {
@@ -183,13 +183,13 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
if (!MediaCodecUtils.codecSupportsType(info, type)) {
return false;
}
- // Check for a supported color format.
+ // Check for a supported color format. //wzw200
if (MediaCodecUtils.selectColorFormat(
- MediaCodecUtils.ENCODER_COLOR_FORMATS, info.getCapabilitiesForType(type.mimeType()))
+ info.getName(), true, MediaCodecUtils.ENCODER_COLOR_FORMATS, info.getCapabilitiesForType(type.mimeType()))
== null) {
return false;
}
- return isHardwareSupportedInCurrentSdk(info, type) && isMediaCodecAllowed(info);
+ return isHardwareSupportedInCurrentSdk(info, type); //wzw200 && isMediaCodecAllowed(info);
}
// Returns true if the given MediaCodecInfo indicates a hardware module that is supported on the
@@ -224,8 +224,9 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
}
- private boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {
- // First, H264 hardware might perform poorly on this model.
+ private boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) { //wzw200
+ /*
+ // First, H264 hardware might perform poorly on this model.
if (H264_HW_EXCEPTION_MODELS.contains(Build.MODEL)) {
return false;
}
@@ -235,6 +236,8 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
// Exynos H264 encoder is supported in LOLLIPOP or later.
|| (name.startsWith(EXYNOS_PREFIX)
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
+ */
+ return true;
}
private boolean isMediaCodecAllowed(MediaCodecInfo info) {
@@ -250,7 +253,7 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
case VP9:
return 100;
case H264:
- return 20;
+ return 1; //wzw200
}
throw new IllegalArgumentException("Unsupported VideoCodecMimeType " + type);
}
@@ -284,8 +287,11 @@ public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
return new BaseBitrateAdjuster();
}
- private boolean isH264HighProfileSupported(MediaCodecInfo info) {
+ private boolean isH264HighProfileSupported(MediaCodecInfo info) {//wzw200
+ return true;
+ /*
return enableH264HighProfile && Build.VERSION.SDK_INT > Build.VERSION_CODES.M
&& info.getName().startsWith(EXYNOS_PREFIX);
+ */
}
}
diff --git a/sdk/android/src/java/org/webrtc/MediaCodecUtils.java b/sdk/android/src/java/org/webrtc/MediaCodecUtils.java
index 9028cc3ae4..08a32fa988 100644
--- a/sdk/android/src/java/org/webrtc/MediaCodecUtils.java
+++ b/sdk/android/src/java/org/webrtc/MediaCodecUtils.java
@@ -64,13 +64,16 @@ class MediaCodecUtils {
}
}
- static @Nullable Integer selectColorFormat(
- int[] supportedColorFormats, CodecCapabilities capabilities) {
- for (int supportedColorFormat : supportedColorFormats) {
- for (int codecColorFormat : capabilities.colorFormats) {
- if (codecColorFormat == supportedColorFormat) {
- return codecColorFormat;
- }
+ static @Nullable Integer selectColorFormat( //wzw200
+ String codeName, boolean isEncode,int[] supportedColorFormats, CodecCapabilities capabilities) {
+
+ for (int supportedColorFormat : supportedColorFormats) {
+ for (int codecColorFormat : capabilities.colorFormats) {
+ if (codecColorFormat == supportedColorFormat &&
+ (isEncode || !codeName.startsWith("OMX.MTK") || supportedColorFormat != CodecCapabilities.COLOR_FormatYUV420Planar) &&
+ (!isEncode || !codeName.startsWith("OMX.IMG.TOPAZ") || supportedColorFormat != CodecCapabilities.COLOR_FormatYUV420Planar)) {
+ return codecColorFormat;
+ }
}
}
return null;
diff --git a/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java b/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java
index 036aca5822..1a994061d1 100644
--- a/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java
+++ b/sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java
@@ -53,9 +53,9 @@ class MediaCodecVideoDecoderFactory implements VideoDecoderFactory {
return null;
}
- CodecCapabilities capabilities = info.getCapabilitiesForType(type.mimeType());
+ CodecCapabilities capabilities = info.getCapabilitiesForType(type.mimeType()); //wzw200
return new AndroidVideoDecoder(new MediaCodecWrapperFactoryImpl(), info.getName(), type,
- MediaCodecUtils.selectColorFormat(MediaCodecUtils.DECODER_COLOR_FORMATS, capabilities),
+ MediaCodecUtils.selectColorFormat(info.getName(), false, MediaCodecUtils.DECODER_COLOR_FORMATS, capabilities),
sharedContext);
}
@@ -114,20 +114,23 @@ class MediaCodecVideoDecoderFactory implements VideoDecoderFactory {
if (!MediaCodecUtils.codecSupportsType(info, type)) {
return false;
}
- // Check for a supported color format.
+ // Check for a supported color format. //wzw200
if (MediaCodecUtils.selectColorFormat(
- MediaCodecUtils.DECODER_COLOR_FORMATS, info.getCapabilitiesForType(type.mimeType()))
+ info.getName(), false, MediaCodecUtils.DECODER_COLOR_FORMATS, info.getCapabilitiesForType(type.mimeType()))
== null) {
return false;
}
return isCodecAllowed(info);
}
- private boolean isCodecAllowed(MediaCodecInfo info) {
+ private boolean isCodecAllowed(MediaCodecInfo info) { //wzw200
+ /*
if (codecAllowedPredicate == null) {
return true;
}
return codecAllowedPredicate.test(info);
+ */
+ return true;
}
private boolean isH264HighProfileSupported(MediaCodecInfo info) {
webrtc 编译参数 m84
git checkout -b 4147 branch-heads/4147
----------------------Android arm64 debug-----------------------
mkdir -p out/android/arm64/debug
gn gen --args="is_debug=true target_os=\"android\" target_cpu=\"arm64\" symbol_level=2 use_rtti=false rtc_include_tests=false rtc_libvpx_build_vp9=true enable_iterator_debugging=false proprietary_codecs=true rtc_opus_variable_complexity=true rtc_use_h264=true treat_warnings_as_errors=false use_custom_libcxx=false" out/android/arm64/debug
ninja -C out/android/arm64/debug
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)