diff --git a/README.md b/README.md index 60e8078b..f4b65c3e 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ bash build_docker_images.sh - [jessibuca](https://github.com/langhuihui/jessibuca) 基于wasm支持H265的播放器 - [wsPlayer](https://github.com/v354412101/wsPlayer) 基于MSE的websocket-fmp4播放器 - [BXC_gb28181Player](https://github.com/any12345com/BXC_gb28181Player) C++开发的支持国标GB28181协议的视频流播放器 + - [RTCPlayer](https://github.com/leo94666/RTCPlayer) 一个基于Android客户端的的RTC播放器 - WEB管理网站 - [zlm_webassist](https://github.com/1002victor/zlm_webassist) 本项目配套的前后端分离web管理项目 @@ -366,6 +367,7 @@ bash build_docker_images.sh [jamesZHANG500](https://github.com/jamesZHANG500) [weidelong](https://github.com/wdl1697454803) [小强先生](https://github.com/linshangqiang) +[李之阳](https://github.com/leo94666) 同时感谢JetBrains对开源项目的支持,本项目使用CLion开发与调试: diff --git a/README_en.md b/README_en.md index 865a2e7f..fe999fb7 100644 --- a/README_en.md +++ b/README_en.md @@ -373,6 +373,8 @@ bash build_docker_images.sh - [WebSocket-fmp4 player based on MSE](https://github.com/v354412101/wsPlayer) - [Domestic webrtc sdk(metaRTC)](https://github.com/metartc/metaRTC) - [GB28181 player implemented in C++](https://github.com/any12345com/BXC_gb28181Player) + - [Android RTCPlayer](https://github.com/leo94666/RTCPlayer) + ## License @@ -525,6 +527,7 @@ Thanks to all those who have supported this project in various ways, including b [jamesZHANG500](https://github.com/jamesZHANG500) [weidelong](https://github.com/wdl1697454803) [小强先生](https://github.com/linshangqiang) +[李之阳](https://github.com/leo94666) Also thank to JetBrains for their support for open source project, we developed and debugged zlmediakit with CLion: diff --git a/webrtc_player/android/.gitignore b/webrtc_player/android/.gitignore deleted file mode 100644 index d4c3a57e..00000000 --- a/webrtc_player/android/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -/build -/captures -.externalNativeBuild -.cxx -local.properties -/.idea/ diff --git a/webrtc_player/android/app-debug.apk b/webrtc_player/android/app-debug.apk deleted file mode 100644 index 969d48b7..00000000 Binary files a/webrtc_player/android/app-debug.apk and /dev/null differ diff --git a/webrtc_player/android/app/.gitignore b/webrtc_player/android/app/.gitignore deleted file mode 100644 index c591fdeb..00000000 --- a/webrtc_player/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -.cxx \ No newline at end of file diff --git a/webrtc_player/android/app/build.gradle b/webrtc_player/android/app/build.gradle deleted file mode 100644 index cfd25638..00000000 --- a/webrtc_player/android/app/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -plugins { - id 'com.android.application' - id 'org.jetbrains.kotlin.android' - id 'kotlin-android-extensions' - id 'kotlin-kapt' - -} -apply plugin: 'kotlin-android' - -android { - compileSdk 32 - - defaultConfig { - applicationId "com.zlmediakit.webrtc" - minSdk 21 - targetSdk 32 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.5.1' - implementation 'com.google.android.material:material:1.6.1' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' - implementation 'com.google.code.gson:gson:2.8.9' - - implementation("com.squareup.okhttp3:okhttp:4.10.0") - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - - implementation 'org.webrtc:google-webrtc:1.0.32006' - -} \ No newline at end of file diff --git a/webrtc_player/android/app/proguard-rules.pro b/webrtc_player/android/app/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/webrtc_player/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/webrtc_player/android/app/src/androidTest/java/com/zlmediakit/webrtc/ExampleInstrumentedTest.kt b/webrtc_player/android/app/src/androidTest/java/com/zlmediakit/webrtc/ExampleInstrumentedTest.kt deleted file mode 100644 index 645a1102..00000000 --- a/webrtc_player/android/app/src/androidTest/java/com/zlmediakit/webrtc/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.zlmediakit.webrtc - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.zlmediakit.webrtc", appContext.packageName) - } -} \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/AndroidManifest.xml b/webrtc_player/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 81281350..00000000 --- a/webrtc_player/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/MainActivity.kt b/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/MainActivity.kt deleted file mode 100644 index 15a8efc8..00000000 --- a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/MainActivity.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.zlmediakit.webrtc - -import android.annotation.SuppressLint -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable -import android.os.Bundle -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.activity_main.view.* - - -class MainActivity : AppCompatActivity() { - - private var isSpeaker = true - - @SuppressLint("SetTextI18n") - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - - lifecycle.addObserver(web_rtc_sv) - - //http://124.223.98.45/index/api/webrtc?app=live&stream=test&type=play - url.setText("http://124.223.98.45/index/api/webrtc?app=live&stream=test&type=play") - - //http://192.168.1.17/index/api/webrtc?app=live&stream=test&type=play - btn_play.setOnClickListener { - web_rtc_sv?.setVideoPath(url.text.toString()) - web_rtc_sv.start() - } - - web_rtc_sv.setOnErrorListener { errorCode, errorMsg -> - runOnUiThread { - Toast.makeText(this, "errorCode:$errorCode,errorMsg:$errorMsg", Toast.LENGTH_SHORT) - .show() - } - } - - - btn_pause.setOnClickListener { - web_rtc_sv?.pause() - } - - btn_resume.setOnClickListener { - web_rtc_sv?.resume() - } - - btn_screenshot.setOnClickListener { - web_rtc_sv?.screenshot { - runOnUiThread { - iv_screen.setImageDrawable(BitmapDrawable(it)) - } - } - } - - btn_mute.setOnClickListener { - web_rtc_sv.mute(true) - } - - - selectAudio() - btn_speaker.setOnClickListener { - selectAudio() - } - - } - - fun selectAudio(){ - if (isSpeaker){ - btn_speaker.setText("扬声器") - web_rtc_sv.setSpeakerphoneOn(isSpeaker) - }else{ - btn_speaker.setText("话筒") - web_rtc_sv.setSpeakerphoneOn(isSpeaker) - } - isSpeaker=!isSpeaker - } -} \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/WebRTCSurfaceView.kt b/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/WebRTCSurfaceView.kt deleted file mode 100644 index 3e94171c..00000000 --- a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/WebRTCSurfaceView.kt +++ /dev/null @@ -1,439 +0,0 @@ -package com.zlmediakit.webrtc - -import android.content.Context -import android.graphics.Bitmap -import android.media.AudioManager -import android.util.AttributeSet -import android.util.Log -import android.view.LayoutInflater -import android.widget.RelativeLayout -import androidx.lifecycle.DefaultLifecycleObserver -import androidx.lifecycle.LifecycleOwner -import com.google.gson.Gson -import okhttp3.* -import okhttp3.MediaType.Companion.toMediaType -import okhttp3.MediaType.Companion.toMediaTypeOrNull -import org.webrtc.* -import org.webrtc.RendererCommon.ScalingType -import org.webrtc.audio.AudioDeviceModule -import org.webrtc.audio.JavaAudioDeviceModule -import java.io.IOException -import java.util.* - -public class WebRTCSurfaceView(context: Context, attrs: AttributeSet?) : - RelativeLayout(context, attrs), DefaultLifecycleObserver, RendererCommon.RendererEvents { - - - private data class sdp(var sdp: String, var username: String, var password: String) - - private data class SdpResponse(var code: Int, var id: String, var sdp: String, var type: String) - - private enum class ErrorCode(val errorCode: Int) { - SUCCESS(0x00), - GET_REMOTE_SDP_ERROR(0x01); - } - - - companion object { - private val TAG = "WebRTCSurfaceView" - - } - - private var mContext: Context = context - - private val eglBase: EglBase = EglBase.create() - private var mEGLBaseContext: EglBase.Context = eglBase.eglBaseContext - - private lateinit var videoUrl: String; - - private var mPeerConnectionFactory: PeerConnectionFactory? = null - - private var mLocalMediaStream: MediaStream? = null - private var mLocalAudioTrack: AudioTrack? = null - private var mAudioSource: AudioSource? = null - - private var mLocalSessionDescription: SessionDescription? = null - private var mRemoteSessionDescription: SessionDescription? = null - - private var mLocalPeer: Peer? = null - - private var mSurfaceViewRenderer: SurfaceViewRenderer - - private lateinit var OnErrorListener: (errorCode: Int, errorMsg: String) -> Unit? - - fun setOnErrorListener(listener: (errorCode: Int, errorMsg: String) -> Unit) { - this.OnErrorListener = listener - } - - private lateinit var OnPreparedListener: () -> Unit? - - fun setOnPreparedListener(listener: () -> Unit) { - this.OnPreparedListener = listener - } - - private val audioManager: AudioManager - - - init { - - val view = LayoutInflater.from(mContext).inflate(R.layout.layout_videoview, this) - - mPeerConnectionFactory = createConnectionFactory() - - mSurfaceViewRenderer = view.findViewById(R.id.surface_view_renderer) - - mSurfaceViewRenderer.init(mEGLBaseContext, this) - mSurfaceViewRenderer.setScalingType(ScalingType.SCALE_ASPECT_FILL) - mSurfaceViewRenderer.setEnableHardwareScaler(true) - - - //创建媒体流 - mLocalMediaStream = mPeerConnectionFactory?.createLocalMediaStream("ARDAMS") - //采集音频 - mAudioSource = mPeerConnectionFactory?.createAudioSource(createAudioConstraints()) - mLocalAudioTrack = mPeerConnectionFactory?.createAudioTrack("ARDAMSa0", mAudioSource) - - //添加Tracks - mLocalMediaStream?.addTrack(mLocalAudioTrack) - - audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager - audioManager.isSpeakerphoneOn = false - - - } - - - private fun set(width: Int, height: Int) { - layoutParams.width = width - layoutParams.height = height - } - - private fun createConnectionFactory(): PeerConnectionFactory? { - - val options = PeerConnectionFactory.InitializationOptions.builder(mContext) - .setEnableInternalTracer(false) - .createInitializationOptions() - - PeerConnectionFactory.initialize(options) - - val videoEncoderFactory = DefaultVideoEncoderFactory( - mEGLBaseContext, - true, - true - ) - - val videoDecoderFactory = DefaultVideoDecoderFactory(mEGLBaseContext) - - - val audioDevice = createJavaAudioDevice() - val peerConnectionFactory = PeerConnectionFactory.builder() - .setAudioDeviceModule(audioDevice) - .setVideoEncoderFactory(videoEncoderFactory) - .setVideoDecoderFactory(videoDecoderFactory) - .createPeerConnectionFactory() - audioDevice.release() - - return peerConnectionFactory - - } - - private fun createAudioConstraints(): MediaConstraints { - val audioConstraints = MediaConstraints() - audioConstraints.mandatory.add( - MediaConstraints.KeyValuePair( - "googEchoCancellation", - "true" - ) - ) - audioConstraints.mandatory.add( - MediaConstraints.KeyValuePair( - "googAutoGainControl", - "false" - ) - ) - audioConstraints.mandatory.add( - MediaConstraints.KeyValuePair( - "googHighpassFilter", - "true" - ) - ) - audioConstraints.mandatory.add( - MediaConstraints.KeyValuePair( - "googNoiseSuppression", - "true" - ) - ) - return audioConstraints - } - - private fun offerOrAnswerConstraint(): MediaConstraints { - val mediaConstraints = MediaConstraints() - val keyValuePairs = java.util.ArrayList() - keyValuePairs.add(MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true")) - keyValuePairs.add(MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true")) - mediaConstraints.mandatory.addAll(keyValuePairs) - return mediaConstraints - } - - private fun createJavaAudioDevice(): AudioDeviceModule { - val audioTrackErrorCallback: JavaAudioDeviceModule.AudioTrackErrorCallback = object : - JavaAudioDeviceModule.AudioTrackErrorCallback { - override fun onWebRtcAudioTrackInitError(errorMessage: String) { - Log.i(TAG, "onWebRtcAudioTrackInitError ============> $errorMessage") - - } - - override fun onWebRtcAudioTrackStartError( - errorCode: JavaAudioDeviceModule.AudioTrackStartErrorCode, errorMessage: String - ) { - Log.i(TAG, "onWebRtcAudioTrackStartError ============> $errorCode:$errorMessage") - - } - - override fun onWebRtcAudioTrackError(errorMessage: String) { - Log.i(TAG, "onWebRtcAudioTrackError ============> $errorMessage") - - } - } - - - // Set audio track state callbacks. - val audioTrackStateCallback: JavaAudioDeviceModule.AudioTrackStateCallback = object : - JavaAudioDeviceModule.AudioTrackStateCallback { - override fun onWebRtcAudioTrackStart() { - Log.i(TAG, "onWebRtcAudioTrackStart ============>") - - } - - override fun onWebRtcAudioTrackStop() { - Log.i(TAG, "onWebRtcAudioTrackStop ============>") - - } - } - - return JavaAudioDeviceModule.builder(mContext) - .setUseHardwareAcousticEchoCanceler(true) - .setUseHardwareNoiseSuppressor(true) - .setAudioTrackErrorCallback(audioTrackErrorCallback) - .setAudioTrackStateCallback(audioTrackStateCallback) - .setUseStereoOutput(true) //立体声 - .createAudioDeviceModule() - } - - fun setVideoPath(url: String) { - videoUrl = url - } - - fun start() { - - mLocalPeer = Peer { - val okHttpClient = OkHttpClient.Builder().build() - - - val body = RequestBody.create("text/plain; charset=utf-8".toMediaType(), it!!) - - - val request: Request = Request.Builder() - .url(videoUrl) - .post(body) - .build() - - val call: Call = okHttpClient.newCall(request) - - call.enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - Log.i(TAG, "onFailure") - OnErrorListener?.invoke( - ErrorCode.GET_REMOTE_SDP_ERROR.errorCode, - e.message.toString() - ) - } - - override fun onResponse(call: Call, response: Response) { - val body = response.body?.string() - val sdpResponse = Gson().fromJson(body, SdpResponse::class.java) - - try { - mRemoteSessionDescription = SessionDescription( - SessionDescription.Type.fromCanonicalForm("answer"), - sdpResponse.sdp - ) - Log.i( - TAG, - "RemoteSdpObserver onCreateSuccess:[SessionDescription[type=${mRemoteSessionDescription?.type?.name},description=${mRemoteSessionDescription?.description}]]" - ) - mLocalPeer?.setRemoteDescription(mRemoteSessionDescription!!) - } catch (e: Exception) { - Log.i(TAG, e.toString()) - OnErrorListener.invoke( - ErrorCode.GET_REMOTE_SDP_ERROR.errorCode, - e.localizedMessage - ) - } - } - }) - } - } - - fun pause() { - mSurfaceViewRenderer.pauseVideo() - //mSurfaceViewRenderer.disableFpsReduction() - } - - fun resume() { - mSurfaceViewRenderer.setFpsReduction(15f) - } - - fun screenshot(listener: (bitmap: Bitmap) -> Unit) { - mSurfaceViewRenderer.addFrameListener({ - listener.invoke(it) - }, 1f) - } - - fun setSpeakerphoneOn(on: Boolean) { - audioManager.isSpeakerphoneOn = on - } - - fun mute(on:Boolean) { - audioManager.isMicrophoneMute=on - } - - override fun onDestroy(owner: LifecycleOwner) { - super.onDestroy(owner) - mSurfaceViewRenderer.release() - mLocalPeer?.mPeerConnection?.dispose() - mAudioSource?.dispose() - mPeerConnectionFactory?.dispose() - } - - override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec) - - } - - inner class Peer(var sdp: (String?) -> Unit = {}) : PeerConnection.Observer, SdpObserver { - - var mPeerConnection: PeerConnection? = null - - init { - mPeerConnection = createPeerConnection() - mPeerConnection?.createOffer(this, offerOrAnswerConstraint()) - } - - //初始化 RTCPeerConnection 连接管道 - private fun createPeerConnection(): PeerConnection? { - if (mPeerConnectionFactory == null) { - mPeerConnectionFactory = createConnectionFactory() - } - // 管道连接抽象类实现方法 - val ICEServers = LinkedList() - val rtcConfig = PeerConnection.RTCConfiguration(ICEServers) - //修改模式 PlanB无法使用仅接收音视频的配置 - //rtcConfig.sdpSemantics = PeerConnection.SdpSemantics.PLAN_B - return mPeerConnectionFactory?.createPeerConnection(rtcConfig, this) - } - - fun setRemoteDescription(sdp: SessionDescription) { - mPeerConnection?.setRemoteDescription(this, sdp) - } - - override fun onCreateSuccess(sessionDescription: SessionDescription?) { - mPeerConnection?.setLocalDescription(this, sessionDescription) - mPeerConnection?.addStream(mLocalMediaStream) - sdp.invoke(sessionDescription?.description) - } - - override fun onSetSuccess() { - - } - - override fun onCreateFailure(p0: String?) { - - } - - override fun onSetFailure(p0: String?) { - - } - - override fun onSignalingChange(signalingState: PeerConnection.SignalingState?) { - Log.i(TAG, "onSignalingChange ============> " + signalingState.toString()) - } - - override fun onIceConnectionChange(iceConnectionState: PeerConnection.IceConnectionState?) { - Log.i(TAG, "onIceConnectionChange ============> " + iceConnectionState.toString()) - - } - - override fun onIceConnectionReceivingChange(p0: Boolean) { - Log.i(TAG, "onIceConnectionReceivingChange ============> $p0") - - } - - override fun onIceGatheringChange(iceGatheringState: PeerConnection.IceGatheringState?) { - Log.i(TAG, "onIceGatheringChange ============> ${iceGatheringState.toString()}") - } - - override fun onIceCandidate(iceCandidate: IceCandidate?) { - Log.i(TAG, "onIceCandidate ============> ${iceCandidate.toString()}") - - - } - - override fun onIceCandidatesRemoved(p0: Array?) { - Log.i(TAG, "onIceCandidatesRemoved ============> ${p0.toString()}") - } - - override fun onAddStream(mediaStream: MediaStream?) { - Log.i(TAG, "onAddStream ============> ${mediaStream?.toString()}") - - if (mediaStream?.videoTracks?.isEmpty() != true) { - val remoteVideoTrack = mediaStream?.videoTracks?.get(0) - remoteVideoTrack?.setEnabled(true) - remoteVideoTrack?.addSink(mSurfaceViewRenderer) - } - - if (mediaStream?.audioTracks?.isEmpty() != true) { - val remoteAudioTrack = mediaStream?.audioTracks?.get(0) - remoteAudioTrack?.setEnabled(true) - remoteAudioTrack?.setVolume(1.0) - } - - - } - - override fun onRemoveStream(mediaStream: MediaStream?) { - Log.i(TAG, "onRemoveStream ============> ${mediaStream.toString()}") - - } - - override fun onDataChannel(dataChannel: DataChannel?) { - Log.i(TAG, "onDataChannel ============> ${dataChannel.toString()}") - - } - - override fun onRenegotiationNeeded() { - Log.i(TAG, "onRenegotiationNeeded ============>") - - } - - override fun onAddTrack(rtpReceiver: RtpReceiver?, p1: Array?) { - Log.i(TAG, "onAddTrack ============>" + rtpReceiver?.track()) - Log.i(TAG, "onAddTrack ============>" + p1?.size) - - } - } - - override fun onFirstFrameRendered() { - Log.i(TAG, "onFirstFrameRendered ============>") - - } - - override fun onFrameResolutionChanged(frameWidth: Int, frameHeight: Int, rotation: Int) { - Log.i(TAG, "onFrameResolutionChanged ============> $frameWidth:$frameHeight:$rotation") - //set(frameWidth,frameHeight) - } - - - - -} \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/webrtc_player/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d11..00000000 --- a/webrtc_player/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/drawable/ic_launcher_background.xml b/webrtc_player/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9c..00000000 --- a/webrtc_player/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/webrtc_player/android/app/src/main/res/layout/activity_main.xml b/webrtc_player/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index fdefb4e5..00000000 --- a/webrtc_player/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/layout/layout_videoview.xml b/webrtc_player/android/app/src/main/res/layout/layout_videoview.xml deleted file mode 100644 index 43c56e5e..00000000 --- a/webrtc_player/android/app/src/main/res/layout/layout_videoview.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/webrtc_player/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cfe..00000000 --- a/webrtc_player/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/webrtc_player/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cfe..00000000 --- a/webrtc_player/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/webrtc_player/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78e..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/webrtc_player/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/webrtc_player/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/webrtc_player/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 62b611da..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/webrtc_player/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/webrtc_player/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/webrtc_player/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 28d4b77f..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/webrtc_player/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9287f508..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/webrtc_player/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index aa7d6427..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/webrtc_player/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9126ae37..00000000 Binary files a/webrtc_player/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and /dev/null differ diff --git a/webrtc_player/android/app/src/main/res/values-night/themes.xml b/webrtc_player/android/app/src/main/res/values-night/themes.xml deleted file mode 100644 index 6a2a7eac..00000000 --- a/webrtc_player/android/app/src/main/res/values-night/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/values/colors.xml b/webrtc_player/android/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127d..00000000 --- a/webrtc_player/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/values/strings.xml b/webrtc_player/android/app/src/main/res/values/strings.xml deleted file mode 100644 index a7484826..00000000 --- a/webrtc_player/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - AndroidWebRTC - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/values/themes.xml b/webrtc_player/android/app/src/main/res/values/themes.xml deleted file mode 100644 index 119a9df9..00000000 --- a/webrtc_player/android/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/xml/backup_rules.xml b/webrtc_player/android/app/src/main/res/xml/backup_rules.xml deleted file mode 100644 index fa0f996d..00000000 --- a/webrtc_player/android/app/src/main/res/xml/backup_rules.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/res/xml/data_extraction_rules.xml b/webrtc_player/android/app/src/main/res/xml/data_extraction_rules.xml deleted file mode 100644 index 9ee9997b..00000000 --- a/webrtc_player/android/app/src/main/res/xml/data_extraction_rules.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/webrtc_player/android/app/src/test/java/com/zlmediakit/webrtc/ExampleUnitTest.kt b/webrtc_player/android/app/src/test/java/com/zlmediakit/webrtc/ExampleUnitTest.kt deleted file mode 100644 index 5f47259f..00000000 --- a/webrtc_player/android/app/src/test/java/com/zlmediakit/webrtc/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.zlmediakit.webrtc - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/webrtc_player/android/build.gradle b/webrtc_player/android/build.gradle deleted file mode 100644 index c9fd0fc4..00000000 --- a/webrtc_player/android/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} -plugins { - id 'com.android.application' version '7.2.1' apply false - id 'com.android.library' version '7.2.1' apply false - id 'org.jetbrains.kotlin.android' version '1.7.10' apply false -} - -task clean(type: Delete) { - delete rootProject.buildDir -} \ No newline at end of file diff --git a/webrtc_player/android/gradle.properties b/webrtc_player/android/gradle.properties deleted file mode 100644 index cd0519bb..00000000 --- a/webrtc_player/android/gradle.properties +++ /dev/null @@ -1,23 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app"s APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official -# Enables namespacing of each library's R class so that its R class includes only the -# resources declared in the library itself and none from the library's dependencies, -# thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file diff --git a/webrtc_player/android/gradle/wrapper/gradle-wrapper.jar b/webrtc_player/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c0..00000000 Binary files a/webrtc_player/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/webrtc_player/android/gradle/wrapper/gradle-wrapper.properties b/webrtc_player/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 8a5b4f05..00000000 --- a/webrtc_player/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Mon Sep 19 22:08:36 CST 2022 -distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip -distributionPath=wrapper/dists -zipStorePath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME diff --git a/webrtc_player/android/gradlew b/webrtc_player/android/gradlew deleted file mode 100644 index 4f906e0c..00000000 --- a/webrtc_player/android/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/webrtc_player/android/gradlew.bat b/webrtc_player/android/gradlew.bat deleted file mode 100644 index 107acd32..00000000 --- a/webrtc_player/android/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/webrtc_player/android/pic/Screenshot_2022-09-25-10-06-59-444_com.zlmediakit.webrtc.jpg b/webrtc_player/android/pic/Screenshot_2022-09-25-10-06-59-444_com.zlmediakit.webrtc.jpg deleted file mode 100644 index 96719cf3..00000000 Binary files a/webrtc_player/android/pic/Screenshot_2022-09-25-10-06-59-444_com.zlmediakit.webrtc.jpg and /dev/null differ diff --git a/webrtc_player/android/settings.gradle b/webrtc_player/android/settings.gradle deleted file mode 100644 index 4a669b32..00000000 --- a/webrtc_player/android/settings.gradle +++ /dev/null @@ -1,24 +0,0 @@ -pluginManagement { - repositories { - gradlePluginPortal() - google() - mavenCentral() - jcenter() // Warning: this repository is going to shut down soon - - maven { url 'https://jitpack.io' } - - } -} -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - jcenter() // Warning: this repository is going to shut down soon - - maven { url 'https://jitpack.io' } - - } -} -rootProject.name = "android" -include ':app'