android 音视频-webRTC 调用摄像头

10 篇文章 0 订阅
10 篇文章 0 订阅
    implementation("com.infobip:google-webrtc:1.0.42469")
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <org.webrtc.SurfaceViewRenderer
        android:id="@+id/viewRender"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.appcompat.widget.LinearLayoutCompat>

package com.example.myapplication

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import com.example.myapplication.databinding.TestWebrtcBinding
import org.webrtc.AudioSource
import org.webrtc.Camera1Enumerator
import org.webrtc.EglBase
import org.webrtc.MediaConstraints
import org.webrtc.PeerConnectionFactory
import org.webrtc.PeerConnectionFactory.InitializationOptions
import org.webrtc.SurfaceTextureHelper
import org.webrtc.VideoCapturer
import org.webrtc.VideoSource


class WEbRTcDemo : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val inflate = TestWebrtcBinding.inflate(layoutInflater)

        setContentView(inflate.root)

        checkPerson()


        // create PeerConnectionFactory
        val initializationOptions =
            InitializationOptions.builder(this).createInitializationOptions()
        PeerConnectionFactory.initialize(initializationOptions)
        val peerConnectionFactory = PeerConnectionFactory.builder().createPeerConnectionFactory()

        // create AudioSource

        val audioSource: AudioSource = peerConnectionFactory.createAudioSource(MediaConstraints())
        peerConnectionFactory.createAudioTrack("101", audioSource)

        val eglBaseContext = EglBase.create().eglBaseContext

        val surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext)

        // create VideoCapturer
        val videoCapturer: VideoCapturer = createCameraCapturer()!!
        val videoSource: VideoSource =
            peerConnectionFactory.createVideoSource(videoCapturer.isScreencast)
        videoCapturer.initialize(
            surfaceTextureHelper,
            applicationContext,
            videoSource.capturerObserver
        )
        videoCapturer.startCapture(480, 640, 30)

        val localView = inflate.viewRender
        localView.setMirror(true)
        localView.init(eglBaseContext, null)

        // create VideoTrack


        val videoTrack = peerConnectionFactory.createVideoTrack("101", videoSource)

        videoTrack.addSink(localView)


    }

    private fun createCameraCapturer(): VideoCapturer? {
        val enumerator = Camera1Enumerator(false)
        val deviceNames = enumerator.deviceNames

        // First, try to find front facing camera
        for (deviceName in deviceNames) {
            if (enumerator.isFrontFacing(deviceName)) {
                val videoCapturer: 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)) {
                val videoCapturer: VideoCapturer? = enumerator.createCapturer(deviceName, null)
                if (videoCapturer != null) {
                    return videoCapturer
                }
            }
        }
        return null
    }


    private fun checkPerson() {
        if (!haNO(arrayOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO))) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO),
                500
            )
        }
    }

    private fun haNO(arrayOf: Array<String>): Boolean {
        for (i in arrayOf.indices) {

            if (ActivityCompat.checkSelfPermission(
                    this,
                    arrayOf[i]
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                return false
            }
        }
        return true
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray,
        deviceId: Int
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)

        if (requestCode == 500) {
            for (i in permissions.indices) {
                if (ActivityCompat.checkSelfPermission(
                        this,
                        permissions[i]
                    ) == PackageManager.PERMISSION_GRANTED
                ) {
                    println("${permissions[i]}授权")
                } else {
                    println("${permissions[i]}为授权")
                }
            }
        }
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南一舟110

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值