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
davidliu
2023-04-21 00:42:39 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Committed by
GitHub
2023-04-21 00:42:39 +0900
Commit
bb955fe95ace78754f014568da53476ea03e58b4
bb955fe9
1 parent
5483d317
Add mirror parameter to VideoRenderer (#218)
显示空白字符变更
内嵌
并排对比
正在显示
3 个修改的文件
包含
39 行增加
和
8 行删除
.idea/inspectionProfiles/Project_Default.xml
livekit-android-sdk/src/main/java/io/livekit/android/compose/VideoRenderer.kt
sample-app-compose/src/main/java/io/livekit/android/composesample/VideoItem.kt
.idea/inspectionProfiles/Project_Default.xml
查看文件 @
bb955fe
...
...
@@ -7,6 +7,7 @@
</inspection_tool>
<inspection_tool
class=
"PreviewApiLevelMustBeValid"
enabled=
"true"
level=
"ERROR"
enabled_by_default=
"true"
>
<option
name=
"composableFile"
value=
"true"
/>
<option
name=
"previewFile"
value=
"true"
/>
</inspection_tool>
<inspection_tool
class=
"PreviewDimensionRespectsLimit"
enabled=
"true"
level=
"WARNING"
enabled_by_default=
"true"
>
<option
name=
"composableFile"
value=
"true"
/>
...
...
@@ -14,6 +15,7 @@
</inspection_tool>
<inspection_tool
class=
"PreviewFontScaleMustBeGreaterThanZero"
enabled=
"true"
level=
"ERROR"
enabled_by_default=
"true"
>
<option
name=
"composableFile"
value=
"true"
/>
<option
name=
"previewFile"
value=
"true"
/>
</inspection_tool>
<inspection_tool
class=
"PreviewMultipleParameterProviders"
enabled=
"true"
level=
"ERROR"
enabled_by_default=
"true"
>
<option
name=
"composableFile"
value=
"true"
/>
...
...
@@ -29,6 +31,7 @@
</inspection_tool>
<inspection_tool
class=
"PreviewNotSupportedInUnitTestFiles"
enabled=
"true"
level=
"ERROR"
enabled_by_default=
"true"
>
<option
name=
"composableFile"
value=
"true"
/>
<option
name=
"previewFile"
value=
"true"
/>
</inspection_tool>
<inspection_tool
class=
"PreviewPickerAnnotation"
enabled=
"true"
level=
"ERROR"
enabled_by_default=
"true"
>
<option
name=
"composableFile"
value=
"true"
/>
...
...
livekit-android-sdk/src/main/java/io/livekit/android/compose/VideoRenderer.kt
查看文件 @
bb955fe
package io.livekit.android.compose
import android.graphics.Matrix
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onGloballyPositioned
...
...
@@ -18,12 +19,20 @@ import io.livekit.android.room.track.video.ComposeVisibility
fun VideoRenderer(
room: Room,
videoTrack: VideoTrack,
modifier: Modifier = Modifier
modifier: Modifier = Modifier,
mirror: Boolean = false,
) {
val videoSinkVisibility = remember(room, videoTrack) { ComposeVisibility() }
var boundVideoTrack by remember { mutableStateOf<VideoTrack?>(null) }
var view: TextureViewRenderer? by remember { mutableStateOf(null) }
var videoScale by remember { mutableStateOf(1f) }
videoScale = if (mirror) {
-1f
} else {
1f
}
fun cleanupVideoTrack() {
view?.let { boundVideoTrack?.removeRenderer(it) }
...
...
@@ -45,6 +54,11 @@ fun VideoRenderer(
}
}
DisposableEffect(view, videoScale) {
view?.scaleX = videoScale
onDispose { }
}
DisposableEffect(room, videoTrack) {
onDispose {
videoSinkVisibility.onDispose()
...
...
sample-app-compose/src/main/java/io/livekit/android/composesample/VideoItem.kt
查看文件 @
bb955fe
...
...
@@ -13,28 +13,42 @@ import io.livekit.android.room.participant.Participant
import io.livekit.android.room.track.Track
import io.livekit.android.room.track.VideoTrack
import io.livekit.android.util.flow
import kotlinx.coroutines.flow.*
/**
* This widget primarily serves as a way to observe changes in [videoTracks].
* This widget primarily serves as a way to observe changes in [
Participant.
videoTracks].
*/
@Composable
fun VideoItemTrackSelector(
room: Room,
participant: Participant,
modifier: Modifier = Modifier
modifier: Modifier = Modifier,
mirror: Boolean = false,
) {
val videoTrackMap by participant::videoTracks.flow.collectAsState(initial = emptyList())
val videoPubs = videoTrackMap.filter { (pub) -> pub.subscribed }
.map { (pub) -> pub }
val videoTrack = videoPubs.firstOrNull { pub -> pub.source == Track.Source.SCREEN_SHARE }?.track as? VideoTrack
?: videoPubs.firstOrNull { pub -> pub.source == Track.Source.CAMERA }?.track as? VideoTrack
?: videoPubs.firstOrNull()?.track as? VideoTrack
if (videoTrack != null) {
// Find the most appropriate video stream to show
// Prioritize screen share, then camera, then any video stream.
val videoPub = videoPubs.firstOrNull { pub -> pub.source == Track.Source.SCREEN_SHARE }
?: videoPubs.firstOrNull { pub -> pub.source == Track.Source.CAMERA }
?: videoPubs.firstOrNull()
val videoTrack = videoPub?.track as? VideoTrack
val videoMuted by
if (videoPub != null) {
videoPub::muted.flow.collectAsState()
} else {
remember(videoPub) {
derivedStateOf { false }
}
}
if (videoTrack != null && !videoMuted) {
VideoRenderer(
room = room,
videoTrack = videoTrack,
mirror = mirror,
modifier = modifier
)
} else {
...
...
请
注册
或
登录
后发表评论