带有Twilio的ARCore如何实现?

时间:2019-03-19 09:25:04

标签: android twilio arcore

我想通过Twilio的视频通话实现ARCore。该文档说这是可能的,但我不知道该怎么做。有人可以告诉我我在做什么错吗?

这是我的活动:

class MixActivity : AppCompatActivity() {

private lateinit var mArFragment: ArFragment
private lateinit var mVideoView: ArSceneView
private var mScreenVideoTrack: LocalVideoTrack? = null

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

    setContentView(R.layout.activity_mix)

    mArFragment = ar_fragment as ArFragment
    mVideoView = mArFragment.arSceneView

    mScreenVideoTrack = LocalVideoTrack.create(this, true,
        ViewCapturer(mVideoView)
    )

} }

这是视图:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

<fragment
        android:id="@+id/ar_fragment"
        android:name="com.google.ar.sceneform.ux.ArFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

 </RelativeLayout>

和VideoCapture:

internal class ViewCapturer(private val view: View) : VideoCapturer, PixelCopy.OnPixelCopyFinishedListener {
private val handler = Handler(Looper.getMainLooper())
private var videoCapturerListener: VideoCapturer.Listener? = null
private val started = AtomicBoolean(false)
private lateinit var mViewBitmap: Bitmap

private val viewCapturer = object : Runnable {
    override fun run() {
        val dropFrame = view.width == 0 || view.height == 0

        // Only capture the view if the dimensions have been established
        if (!dropFrame) {
            // Draw view into bitmap backed canvas
            val measuredWidth = View.MeasureSpec.makeMeasureSpec(
                view.width,
                View.MeasureSpec.EXACTLY
            )
            val measuredHeight = View.MeasureSpec.makeMeasureSpec(
                view.height,
                View.MeasureSpec.EXACTLY
            )
            view.measure(measuredWidth, measuredHeight)
            view.layout(0, 0, view.measuredWidth, view.measuredHeight)

            mViewBitmap = Bitmap.createBitmap(
                view.width, view.height,
                Bitmap.Config.ARGB_8888
            )
            val viewCanvas = Canvas(mViewBitmap)
            view.draw(viewCanvas)

            // Extract the frame from the bitmap
            val bytes = mViewBitmap.byteCount
            val buffer = ByteBuffer.allocate(bytes)
            mViewBitmap.copyPixelsToBuffer(buffer)
            val array = buffer.array()
            val captureTimeNs = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime())

            // Create video frame
            val dimensions = VideoDimensions(view.width, view.height)
            val videoFrame = VideoFrame(
                array,
                dimensions, VideoFrame.RotationAngle.ROTATION_0, captureTimeNs
            )

            // Notify the listener
            if (started.get()) {
                videoCapturerListener!!.onFrameCaptured(videoFrame)
            }
        }

        // Schedule the next capture
        if (started.get()) {
            handler.postDelayed(this, VIEW_CAPTURER_FRAMERATE_MS.toLong())
        }
    }
}

/**
 * Returns the list of supported formats for this view capturer. Currently, only supports
 * capturing to RGBA_8888 bitmaps.
 *
 * @return list of supported formats.
 */
override fun getSupportedFormats(): List<VideoFormat> {
    val videoFormats = ArrayList<VideoFormat>()
    val videoDimensions = VideoDimensions(view.width, view.height)
    val videoFormat = VideoFormat(videoDimensions, 30, VideoPixelFormat.RGBA_8888)

    videoFormats.add(videoFormat)

    return videoFormats
}

/**
 * Returns true because we are capturing screen content.
 */
override fun isScreencast(): Boolean {
    return true
}

/**
 * This will be invoked when it is time to start capturing frames.
 *
 * @param videoFormat the video format of the frames to be captured.
 * @param listener capturer listener.
 */
override fun startCapture(videoFormat: VideoFormat, listener: VideoCapturer.Listener) {
    // Store the capturer listener
    this.videoCapturerListener = listener
    this.started.set(true)

    // Notify capturer API that the capturer has started
    val capturerStarted = handler.postDelayed(
        viewCapturer,
        VIEW_CAPTURER_FRAMERATE_MS.toLong()
    )
    this.videoCapturerListener!!.onCapturerStarted(capturerStarted)
}

/**
 * Stop capturing frames. Note that the SDK cannot receive frames once this has been invoked.
 */
override fun stopCapture() {
    this.started.set(false)
    handler.removeCallbacks(viewCapturer)
}

override fun onPixelCopyFinished(i: Int) {
    // Extract the frame from the bitmap
    val bytes = mViewBitmap.getByteCount()
    val buffer = ByteBuffer.allocate(bytes)
    mViewBitmap.copyPixelsToBuffer(buffer)
    val array = buffer.array()
    val captureTimeNs = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime())

    // Create video frame
    val dimensions = VideoDimensions(view.width, view.height)
    val videoFrame = VideoFrame(
        array,
        dimensions, VideoFrame.RotationAngle.ROTATION_0, captureTimeNs
    )

    // Notify the listener
    if (started.get()) {
        videoCapturerListener?.onFrameCaptured(videoFrame)
    }
    if (started.get()) {
        handler.postDelayed(viewCapturer, VIEW_CAPTURER_FRAMERATE_MS.toLong())
    }
}

companion object {
    private val VIEW_CAPTURER_FRAMERATE_MS = 100
}
}

ARCore部分有效,但Twilio部分无效。 我提到了另一篇有关它的文章,但它并不完整: Streaming CustomView ARcore with Twilio video

0 个答案:

没有答案