Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
xuning
/
livekitAndroidXuningTest
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
David Zhao
2021-05-29 21:41:58 -0700
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
5325a97b46963e4d3786b76d93b7bf6dd1aea1fb
5325a97b
1 parent
170ff987
Audio noise cancellation optionns, video capture resolution control
显示空白字符变更
内嵌
并排对比
正在显示
10 个修改的文件
包含
93 行增加
和
34 行删除
build.gradle
livekit-android-sdk/src/main/java/io/livekit/android/room/PeerConnectionTransport.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/participant/LocalParticipant.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/AudioOptions.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/AudioTrack.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalAudioTrack.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalAudioTrackOptions.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalVideoTrack.kt
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalVideoTrackOptions.kt
build.gradle
查看文件 @
5325a97
...
...
@@ -11,7 +11,7 @@ buildscript {
}
dependencies
{
classpath
'com.android.tools.build:gradle:7.0.0-beta0
2
'
classpath
'com.android.tools.build:gradle:7.0.0-beta0
3
'
classpath
"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath
"org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath
"org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/PeerConnectionTransport.kt
查看文件 @
5325a97
...
...
@@ -22,7 +22,6 @@ constructor(
) {
val peerConnection: PeerConnection = connectionFactory.createPeerConnection(
config,
RTCEngine.CONN_CONSTRAINTS,
listener
) ?: throw IllegalStateException("peer connection creation failed?")
val pendingCandidates = mutableListOf<IceCandidate>()
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/RTCEngine.kt
查看文件 @
5325a97
...
...
@@ -225,6 +225,7 @@ constructor(
val rtcConfig = PeerConnection.RTCConfiguration(iceServers).apply {
sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN
continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLY
enableDtlsSrtp = true
}
publisher = pctFactory.create(rtcConfig, publisherObserver)
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/participant/LocalParticipant.kt
查看文件 @
5325a97
...
...
@@ -33,19 +33,30 @@ internal constructor(
get() = tracks.values.toList()
fun createAudioTrack(
audioConstraints: MediaConstraints = MediaConstraints(),
name: String = ""
) = LocalAudioTrack.createTrack(peerConnectionFactory, audioConstraints, name)
name: String = "",
options: LocalAudioTrackOptions = LocalAudioTrackOptions(),
): LocalAudioTrack {
val audioConstraints = MediaConstraints()
val items = listOf(
MediaConstraints.KeyValuePair("googEchoCancellation", options.echoCancellation.toString()),
MediaConstraints.KeyValuePair("googAutoGainControl", options.autoGainControl.toString()),
MediaConstraints.KeyValuePair("googHighpassFilter", options.highPassFilter.toString()),
MediaConstraints.KeyValuePair("googNoiseSuppression", options.noiseSuppression.toString()),
MediaConstraints.KeyValuePair("googTypingNoiseDetection", options.typingNoiseDetection.toString()),
)
// audioConstraints.optional.addAll(items)
return LocalAudioTrack.createTrack(peerConnectionFactory, audioConstraints, name)
}
fun createVideoTrack(
isScreencast: Boolean = false,
name: String = "",
options: LocalVideoTrackOptions = LocalVideoTrackOptions(),
): LocalVideoTrack {
return LocalVideoTrack.createTrack(
peerConnectionFactory,
context,
isScreencast,
name,
options,
eglBase
)
}
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/track/AudioOptions.kt
已删除
100644 → 0
查看文件 @
170ff98
package io.livekit.android.room.track
class AudioOptions {
}
\ No newline at end of file
livekit-android-sdk/src/main/java/io/livekit/android/room/track/AudioTrack.kt
查看文件 @
5325a97
...
...
@@ -5,5 +5,4 @@ import org.webrtc.AudioTrack
open class AudioTrack(name: String, override val rtcTrack: AudioTrack) :
Track(name, Kind.AUDIO, rtcTrack) {
}
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalAudioTrack.kt
查看文件 @
5325a97
...
...
@@ -11,7 +11,6 @@ import java.util.*
*/
class LocalAudioTrack(
name: String,
audioOptions: AudioOptions? = null,
mediaTrack: org.webrtc.AudioTrack
) : AudioTrack(name, mediaTrack) {
var enabled: Boolean
...
...
@@ -20,16 +19,12 @@ class LocalAudioTrack(
rtcTrack.setEnabled(value)
}
var audioOptions = audioOptions
private set
companion object {
internal fun createTrack(
factory: PeerConnectionFactory,
audioConstraints: MediaConstraints = MediaConstraints(),
name: String = ""
): LocalAudioTrack {
val audioSource = factory.createAudioSource(audioConstraints)
val rtcAudioTrack =
factory.createAudioTrack(UUID.randomUUID().toString(), audioSource)
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalAudioTrackOptions.kt
0 → 100644
查看文件 @
5325a97
package io.livekit.android.room.track
class LocalAudioTrackOptions(
var noiseSuppression: Boolean = true,
var echoCancellation: Boolean = true,
var autoGainControl: Boolean = true,
var highPassFilter: Boolean = true,
var typingNoiseDetection: Boolean = true,
)
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalVideoTrack.kt
查看文件 @
5325a97
...
...
@@ -14,10 +14,11 @@ class LocalVideoTrack(
private val capturer: VideoCapturer,
private val source: VideoSource,
name: String,
private val options: LocalVideoTrackOptions,
rtcTrack: org.webrtc.VideoTrack
) : VideoTrack(name, rtcTrack) {
fun startCapture() {
capturer.startCapture(
400, 400, 30
)
capturer.startCapture(
options.captureParams.width, options.captureParams.height, options.captureParams.maxFps
)
}
override fun stop() {
...
...
@@ -29,12 +30,12 @@ class LocalVideoTrack(
internal fun createTrack(
peerConnectionFactory: PeerConnectionFactory,
context: Context,
isScreencast: Boolean,
name: String,
options: LocalVideoTrackOptions,
rootEglBase: EglBase,
): LocalVideoTrack {
val source = peerConnectionFactory.createVideoSource(isScreencast)
val capturer = createVideoCapturer(context) ?: TODO()
val source = peerConnectionFactory.createVideoSource(options.isScreencast)
val capturer = createVideoCapturer(context, options.position) ?: TODO()
capturer.initialize(
SurfaceTextureHelper.create("VideoCaptureThread", rootEglBase.eglBaseContext),
context,
...
...
@@ -45,16 +46,17 @@ class LocalVideoTrack(
return LocalVideoTrack(
capturer = capturer,
source = source,
options = options,
name = name,
rtcTrack = track,
)
}
private fun createVideoCapturer(context: Context): VideoCapturer? {
private fun createVideoCapturer(context: Context
, position: CameraPosition
): VideoCapturer? {
val videoCapturer: VideoCapturer? = if (Camera2Enumerator.isSupported(context)) {
createCameraCapturer(Camera2Enumerator(context))
createCameraCapturer(Camera2Enumerator(context)
, position
)
} else {
createCameraCapturer(Camera1Enumerator(true))
createCameraCapturer(Camera1Enumerator(true)
, position
)
}
if (videoCapturer == null) {
Timber.d { "Failed to open camera" }
...
...
@@ -63,24 +65,18 @@ class LocalVideoTrack(
return videoCapturer
}
private fun createCameraCapturer(enumerator: CameraEnumerator): VideoCapturer? {
private fun createCameraCapturer(enumerator: CameraEnumerator
, position: CameraPosition
): VideoCapturer? {
val deviceNames = enumerator.deviceNames
// First, try to find front facing camera
for (deviceName in deviceNames) {
if (enumerator.isFrontFacing(deviceName)) {
if (enumerator.isFrontFacing(deviceName)
&& position == CameraPosition.FRONT
) {
Timber.v { "Creating front facing camera capturer." }
val videoCapturer = enumerator.createCapturer(deviceName, null)
if (videoCapturer != null) {
return videoCapturer
}
}
}
// Front facing camera not found, try something else
for (deviceName in deviceNames) {
if (!enumerator.isFrontFacing(deviceName)) {
Timber.v { "Creating other camera capturer." }
} else if (enumerator.isBackFacing(deviceName) && position == CameraPosition.BACK) {
Timber.v { "Creating back facing camera capturer." }
val videoCapturer = enumerator.createCapturer(deviceName, null)
if (videoCapturer != null) {
return videoCapturer
...
...
livekit-android-sdk/src/main/java/io/livekit/android/room/track/LocalVideoTrackOptions.kt
0 → 100644
查看文件 @
5325a97
package io.livekit.android.room.track
class LocalVideoTrackOptions(
var isScreencast: Boolean = false,
var position: CameraPosition = CameraPosition.FRONT,
var captureParams: VideoCaptureParameter = VideoPreset.QHD.capture
)
class VideoCaptureParameter(
val width: Int,
val height: Int,
val maxFps: Int,
)
class VideoEncoding(
val maxBitrate: Int,
val maxFps: Int,
)
enum class CameraPosition {
FRONT,
BACK
}
/**
* Video presets along with suggested bitrates
*/
enum class VideoPreset(
val capture: VideoCaptureParameter,
val encoding: VideoEncoding,
) {
QVGA(
VideoCaptureParameter(320, 240, 15),
VideoEncoding(100_000, 15),
),
VGA(
VideoCaptureParameter(640, 360, 30),
VideoEncoding(400_000, 30),
),
QHD(
VideoCaptureParameter(960, 540, 30),
VideoEncoding(700_000, 30),
),
HD(
VideoCaptureParameter(1280, 720, 30),
VideoEncoding(2_000_000, 30),
),
FHD(
VideoCaptureParameter(1920, 1080, 30),
VideoEncoding(4_000_000, 30),
)
}
\ No newline at end of file
...
...
请
注册
或
登录
后发表评论