From 31264e4cf4e13b2b4439725452c6a9b4ae86093c Mon Sep 17 00:00:00 2001 From: li <719947897@ qq.com> Date: Thu, 30 May 2024 18:00:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A1=8C=E9=9D=A2=E6=8E=A8=E6=B5=81ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zlmediakit/webrtc/PlayerDemoActivity.kt | 4 +- .../zlmediakit/webrtc/PusherDemoActivity.kt | 13 +++- webrtc_player/android/play.sdp | 76 +++++++++++++++++++ .../src/main/java/com/zlm/rtc/ZLMRTCPlayer.kt | 35 +-------- .../src/main/java/com/zlm/rtc/ZLMRTCPusher.kt | 7 +- .../zlm/rtc/client/PeerConnectionClient.java | 8 +- .../java/com/zlm/rtc/play/ZLMRTCPlayerImpl.kt | 37 +++++---- .../java/com/zlm/rtc/push/ZLMRTCPusherImpl.kt | 10 +-- 8 files changed, 129 insertions(+), 61 deletions(-) create mode 100644 webrtc_player/android/play.sdp diff --git a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PlayerDemoActivity.kt b/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PlayerDemoActivity.kt index 045b6084..0f016858 100644 --- a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PlayerDemoActivity.kt +++ b/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PlayerDemoActivity.kt @@ -25,7 +25,7 @@ class PlayerDemoActivity : AppCompatActivity() { //ffmpeg -re -stream_loop -1 -i "D:\li\hot\data\data\baseline.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp -bf 0 rtsp://zlmediakit.com/live/li //ffmpeg -re -stream_loop -1 -i "D:\li\hot\data\data\test.mp4" -vcodec h264 -acodec aac -f flv -bf 0 rtmp://zlmediakit.com/live/li - player.bind(surface_view_renderer, false) + player.bind(surface_view_renderer) } @@ -65,6 +65,6 @@ class PlayerDemoActivity : AppCompatActivity() { } fun onVolume(view: View) { - player.setSpeakerphoneOn(true) + player.setVolume() } } \ No newline at end of file diff --git a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PusherDemoActivity.kt b/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PusherDemoActivity.kt index 7b9a9cff..9139dda4 100644 --- a/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PusherDemoActivity.kt +++ b/webrtc_player/android/app/src/main/java/com/zlmediakit/webrtc/PusherDemoActivity.kt @@ -62,7 +62,18 @@ class PusherDemoActivity : AppCompatActivity() { } fun onPushFile(view: View) { - + PermissionX.init(this) + .permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE) + .request { allGranted, grantedList, deniedList -> + if (allGranted) { + pusher.push( + tv_app.text.toString(), + tv_stream_id.text.toString(), + PushMode.FILE, + "" + ) + } + } } override fun onDestroy() { diff --git a/webrtc_player/android/play.sdp b/webrtc_player/android/play.sdp new file mode 100644 index 00000000..36265010 --- /dev/null +++ b/webrtc_player/android/play.sdp @@ -0,0 +1,76 @@ +v=0 +o=- 5986549880880292178 2 IN IP4 108.181.24.73 +s=- +t=0 0 +a=group:BUNDLE 0 1 +a=msid-semantic: WMS ARDAMS +a=ice-lite +m=audio 8000 UDP/TLS/RTP/SAVPF 111 +c=IN IP4 108.181.24.73 +a=rtcp:8000 IN IP4 108.181.24.73 +a=ice-ufrag:bLUYSR9AH0A=_2105 +a=ice-pwd:wstnRIopRDwBZyv56AZlGuOm +a=ice-options:trickle +a=fingerprint:sha-256 F4:C9:0C:ED:05:93:C0:F9:AC:34:71:60:2D:3E:D0:47:91:CC:FD:38:C7:63:4A:93:C3:48:0C:B4:6F:32:76:FE +a=setup:passive +a=mid:0 +a=ice-lite +a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level +a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time +a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 +a=inactive +a=rtcp-mux +a=rtpmap:111 opus/48000/2 +a=rtcp-fb:111 transport-cc +a=fmtp:111 minptime=10;useinbandfec=1 +a=msid:zlmediakit-mslabel zlmediakit-label-0 +a=ssrc:2 cname:zlmediakit-rtp +a=ssrc:2 msid:zlmediakit-mslabel zlmediakit-label-0 +a=ssrc:2 mslabel:zlmediakit-mslabel +a=ssrc:2 label:zlmediakit-label-0 +a=candidate:udpcandidate 1 udp 110 108.181.24.73 8000 typ host +a=candidate:tcpcandidate 1 tcp 105 108.181.24.73 8000 typ host tcptype passive + + +m=video 8000 UDP/TLS/RTP/SAVPF 127 103 +c=IN IP4 108.181.24.73 +a=rtcp:8000 IN IP4 108.181.24.73 +a=ice-ufrag:bLUYSR9AH0A=_2105 +a=ice-pwd:wstnRIopRDwBZyv56AZlGuOm +a=ice-options:trickle +a=fingerprint:sha-256 F4:C9:0C:ED:05:93:C0:F9:AC:34:71:60:2D:3E:D0:47:91:CC:FD:38:C7:63:4A:93:C3:48:0C:B4:6F:32:76:FE +a=setup:passive +a=mid:1 +a=ice-lite +a=extmap:14 urn:ietf:params:rtp-hdrext:toffset +a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time +a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01 +a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay +a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type +a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing +a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space +a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id +a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id +a=sendonly +a=rtcp-mux +a=rtpmap:127 H264/90000 +a=rtcp-fb:127 ccm fir +a=rtcp-fb:127 goog-remb +a=rtcp-fb:127 nack +a=rtcp-fb:127 nack pli +a=rtcp-fb:127 transport-cc +a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f +a=rtpmap:103 rtx/90000 +a=fmtp:103 apt=127 +a=msid:zlmediakit-mslabel zlmediakit-label-1 +a=ssrc:1 cname:zlmediakit-rtp +a=ssrc:1 msid:zlmediakit-mslabel zlmediakit-label-1 +a=ssrc:1 mslabel:zlmediakit-mslabel +a=ssrc:1 label:zlmediakit-label-1 +a=ssrc:3 cname:zlmediakit-rtp +a=ssrc:3 msid:zlmediakit-mslabel zlmediakit-label-1 +a=ssrc:3 mslabel:zlmediakit-mslabel +a=ssrc:3 label:zlmediakit-label-1 +a=ssrc-group:FID 1 3 +a=candidate:udpcandidate 1 udp 110 108.181.24.73 8000 typ host +a=candidate:tcpcandidate 1 tcp 105 108.181.24.73 8000 typ host tcptype passive diff --git a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPlayer.kt b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPlayer.kt index 0ee4fd09..e88b5e90 100644 --- a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPlayer.kt +++ b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPlayer.kt @@ -7,52 +7,21 @@ import org.webrtc.SurfaceViewRenderer abstract class ZLMRTCPlayer { -// companion object { -// fun shareInstance(): ZLMRTCPlayer { -// return ZLMRTCPlayerImpl(this) -// } -// } - - - - - - constructor() - - public abstract fun bind(surface: SurfaceViewRenderer, localPreview:Boolean) - + public abstract fun bind(surface: SurfaceViewRenderer) //拉流接口 public abstract fun play(app: String, streamId: String) - public abstract fun setSpeakerphoneOn(on: Boolean) - - public abstract fun setLocalMute(on: Boolean) - + public abstract fun setVolume() public abstract fun stop() public abstract fun pause() - - public abstract fun resume() public abstract fun capture(listener: (bitmap: Bitmap) -> Unit) public abstract fun record(duration: Long, result: (path: String) -> Unit) - - //推流接口 -// public abstract fun startLocalPreview() -// -// public abstract fun stopLocalPreview() -// -// public abstract fun startPublishing() -// -// public abstract fun stopPublishing() - - - // - } \ No newline at end of file diff --git a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPusher.kt b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPusher.kt index 9a51f223..3e8be01e 100644 --- a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPusher.kt +++ b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/ZLMRTCPusher.kt @@ -8,7 +8,12 @@ abstract class ZLMRTCPusher { public abstract fun bind(surface: SurfaceViewRenderer, localPreview: Boolean) - abstract fun push(app: String, streamId: String, mode: PushMode = PushMode.CAMERA) + abstract fun push( + app: String, + streamId: String, + mode: PushMode = PushMode.CAMERA, + inputFile: String = "" + ) abstract fun stop() diff --git a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/client/PeerConnectionClient.java b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/client/PeerConnectionClient.java index e901cea4..47763fd9 100644 --- a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/client/PeerConnectionClient.java +++ b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/client/PeerConnectionClient.java @@ -693,8 +693,6 @@ public class PeerConnectionClient { if (saveVideoFileRecorder == null) { saveVideoFileRecorder = new VideoFileRecorder(); } -// peerConnection.addTransceiver(MediaStreamTrack.MediaType.MEDIA_TYPE_AUDIO,new RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.SEND_RECV)); -// peerConnection.addTransceiver(MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO,new RtpTransceiver.RtpTransceiverInit(RtpTransceiver.RtpTransceiverDirection.SEND_RECV)); Log.d(TAG, "Peer connection created."); @@ -720,7 +718,7 @@ public class PeerConnectionClient { rtcConfig.keyType = PeerConnection.KeyType.ECDSA; // Enable DTLS for normal calls and disable for loopback calls. rtcConfig.activeResetSrtpParams = true;//!peerConnectionParameters.loopback; - rtcConfig.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN; + rtcConfig.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN; //修改模式 PlanB无法使用仅接收音视频的配置 PCObserver pcObserver = new PCObserver(); SDPObserver sdpObserver = new SDPObserver(); @@ -1376,7 +1374,8 @@ public class PeerConnectionClient { if (peerConnection == null || isError) { return; } - Log.d(TAG, "==onAddStream tracks size:" + stream.videoTracks.size()); + Log.d(TAG, "==onAddStream video tracks size:" + stream.videoTracks.size()); + Log.d(TAG, "==onAddStream audio tracks size:" + stream.audioTracks.size()); if (stream.videoTracks.size() == 1) { remoteVideoTrack = stream.videoTracks.get(0); remoteVideoTrack.setEnabled(true); @@ -1386,7 +1385,6 @@ public class PeerConnectionClient { connection.videoTrack.addSink(saveVideoFileRecorder); } events.onRemoteRender(connection.handleId); - } } }); diff --git a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/play/ZLMRTCPlayerImpl.kt b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/play/ZLMRTCPlayerImpl.kt index 4483584b..d89e42ed 100644 --- a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/play/ZLMRTCPlayerImpl.kt +++ b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/play/ZLMRTCPlayerImpl.kt @@ -16,6 +16,7 @@ import org.webrtc.CameraEnumerator import org.webrtc.EglBase import org.webrtc.IceCandidate import org.webrtc.PeerConnectionFactory +import org.webrtc.RendererCommon import org.webrtc.SessionDescription import org.webrtc.StatsReport import org.webrtc.SurfaceViewRenderer @@ -98,12 +99,12 @@ class ZLMRTCPlayerImpl(val context: Context) : ZLMRTCPlayer(), 1280, 720, defaultFps, - 1024 * 1000 * 2, + 1024 * 1024 * 2, "H264", true, - true, + false, 0, - "OPUS", + "opus", false, false, false, @@ -116,29 +117,38 @@ class ZLMRTCPlayerImpl(val context: Context) : ZLMRTCPlayer(), ) } - override fun bind(surface: SurfaceViewRenderer, localPreview: Boolean) { + override fun bind(surface: SurfaceViewRenderer) { this.surfaceViewRenderer = surface audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager - audioManager?.isSpeakerphoneOn = false + audioManager?.isSpeakerphoneOn = true } override fun play(app: String, streamId: String) { this.app = app this.streamId = streamId if (peerConnectionClient == null) peerConnectionClient = initPeerConnectionClient() - surfaceViewRenderer?.init(eglBase?.eglBaseContext, null) + surfaceViewRenderer?.init(eglBase?.eglBaseContext, object : RendererCommon.RendererEvents { + override fun onFirstFrameRendered() { + + } + + override fun onFrameResolutionChanged( + videoWidth: Int, + videoHeight: Int, + rotation: Int + ) { + + } + }) peerConnectionClient?.setAudioEnabled(true) peerConnectionClient?.createPeerConnectionFactory(PeerConnectionFactory.Options()) peerConnectionClient?.createPeerConnection(createVideoCapture(context), localHandleId) peerConnectionClient?.createOffer(localHandleId) } - override fun setSpeakerphoneOn(on: Boolean) { - audioManager?.isSpeakerphoneOn = on - } - override fun setLocalMute(on: Boolean) { - audioManager?.isSpeakerphoneOn = on + override fun setVolume() { + audioManager?.isSpeakerphoneOn = true } override fun stop() { @@ -167,8 +177,9 @@ class ZLMRTCPlayerImpl(val context: Context) : ZLMRTCPlayer(), override fun record(duration: Long, result: (path: String) -> Unit) { - val savePath = context.cacheDir.absoluteFile.absolutePath + File.separator + System.currentTimeMillis() + ".mp4" - peerConnectionClient?.setRecordEnable(true,savePath) + val savePath = + context.cacheDir.absoluteFile.absolutePath + File.separator + System.currentTimeMillis() + ".mp4" + peerConnectionClient?.setRecordEnable(true, savePath) Handler().postDelayed({ peerConnectionClient?.setRecordEnable(false, savePath) }, duration) diff --git a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/push/ZLMRTCPusherImpl.kt b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/push/ZLMRTCPusherImpl.kt index 1ab0caaa..56208539 100644 --- a/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/push/ZLMRTCPusherImpl.kt +++ b/webrtc_player/android/zlm/src/main/java/com/zlm/rtc/push/ZLMRTCPusherImpl.kt @@ -18,6 +18,7 @@ import org.webrtc.Camera1Enumerator import org.webrtc.Camera2Enumerator import org.webrtc.CameraEnumerator import org.webrtc.EglBase +import org.webrtc.FileVideoCapturer import org.webrtc.IceCandidate import org.webrtc.PeerConnectionFactory import org.webrtc.ScreenCapturerAndroid @@ -36,8 +37,6 @@ class ZLMRTCPusherImpl(val context: FragmentActivity) : ZLMRTCPusher(), private var eglBase: EglBase? = null - private var defaultFps = 24 - private var surfaceViewRenderer: SurfaceViewRenderer? = null private var localHandleId = BigInteger.valueOf(Random(2048).nextLong()) @@ -140,7 +139,7 @@ class ZLMRTCPusherImpl(val context: FragmentActivity) : ZLMRTCPusher(), } - override fun push(app: String, streamId: String, mode: PushMode) { + override fun push(app: String, streamId: String, mode: PushMode, inputFile: String) { this.app = app this.streamId = streamId if (peerConnectionClient == null) peerConnectionClient = initPeerConnectionClient() @@ -174,10 +173,9 @@ class ZLMRTCPusherImpl(val context: FragmentActivity) : ZLMRTCPusher(), } } else { - + peerConnectionClient?.createPeerConnection(FileVideoCapturer(inputFile), localHandleId) + peerConnectionClient?.createOffer(localHandleId) } - - } override fun stop() {