kotlion 实现android WebRTC本地流Demo
由于手机端浏览器播放云游戏流效果不太理想,所以考虑开发专有手机端,目前两个想法,第一用私有协议实现视频传输推流,第二基于android WebRTC。第二由我来负责,特此把开发学习过程中写的小demo记录下。
参考链接:https://www.jianshu.com/p/eb5fd116e6c8
原文链接:https://blog.csdn.net/weixin_44259356/article/details/101449173
核心代码
基本思路和参考链接想法一样,只是语言换成了kotlion,有部分的函数调用略有区别,使用摄像头采集流显示在首栏,然后推流到第二栏,核心代码如下:
xml代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/FID"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" android:id="@+id/TEXT_ID"/>
<org.webrtc.SurfaceViewRenderer
android:id="@+id/localView"
android:layout_width="match_parent"
android:layout_height="100pt"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<org.webrtc.SurfaceViewRenderer
android:id="@+id/remoteView"
android:layout_width="match_parent"
android:layout_height="100pt"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
Activity代码
val eglBaseContext = EglBase.create().eglBaseContext
// create PeerConnectionFactory
PeerConnectionFactory.initialize(
PeerConnectionFactory.InitializationOptions
.builder(this)
.createInitializationOptions()
)
val options = PeerConnectionFactory.Options()
val defaultVideoEncoderFactory = DefaultVideoEncoderFactory(eglBaseContext, true, true)
val defaultVideoDecoderFactory = DefaultVideoDecoderFactory(eglBaseContext)
peerConnectionFactory = PeerConnectionFactory.builder()
.setOptions(options)
.setVideoEncoderFactory(defaultVideoEncoderFactory)
.setVideoDecoderFactory(defaultVideoDecoderFactory)
.createPeerConnectionFactory()
val surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext)
// create VideoCapturer
val videoCapturer = createCameraCapturer(true)
val videoSource = peerConnectionFactory.createVideoSource(videoCapturer!!.isScreencast)
videoCapturer.initialize(
surfaceTextureHelper,
applicationContext,
videoSource.capturerOb