Как воспроизводить видео на заказной поверхности - PullRequest
0 голосов
/ 30 апреля 2019

Есть два видео: отсканированный багаж и багаж:

Two videos

Задача , чтобы показать оба видео одновременно перекрывающимися с областью круга, подвижной по экрану касанием:

Result expected

Я вижу два пути решения: Ways to solve

Way1: поместите рентгеновское видео внизу, оригинальное видео под ним и обрежьте область круга.

Way2: воспроизводить оригинальное видео внизу, создавать круглую поверхность и воспроизводить рентгеновское видео на поверхности

Я выбрал Way1. Для видео 1 используется SurfaceView с резьбой для обработки холста. Видео 2 (рентгеновское изображение), расположенное под SurfaceView с использованием constraintLayout:

class CircleSurfaceView(context: Context, attrs: AttributeSet) : SurfaceView(context, attrs), SurfaceHolder.Callback {
    private val drawThread by lazy { DrawThread(holder, resources,context) }
    private val player     by lazy { MediaPlayer.create(context, R.raw.dl_transhealthytolipid) }

    init {
        holder.addCallback(this)
    }

    override fun surfaceCreated(holder: SurfaceHolder?) {
        drawThread.setRunning(true)
        drawThread.start()
        player.setDisplay(holder)
        player.isLooping=true
        player.start()
        this.setBackgroundColor(Color.TRANSPARENT)
    }
    override fun surfaceChanged(holder: SurfaceHolder?, format: Int, width: Int, height: Int) {
    }
    override fun surfaceDestroyed(holder: SurfaceHolder?) {
        var isProcessing = true
        drawThread.setRunning(false)
        while (isProcessing) {
            try {
                drawThread.join()
                isProcessing = false
            } catch (e: InterruptedException) {
            }
        }
    }
}

Нить для обрезки холста:

internal class DrawThread(private val surfaceHolder: SurfaceHolder, resources: Resources,context: Context) : Thread() {
    private var isProcessing = false
    private var previousTime: Long = 0

    fun setRunning(run: Boolean) {
        isProcessing = run
    }

    override fun run() {
        var canvas: Canvas?
        while (isProcessing) {
            // Perform the clipping every 30 mS
            val now = System.currentTimeMillis()
            val elapsedTime = now - previousTime
            if (elapsedTime > 30) {
                previousTime = now
            }
            synchronized(surfaceHolder) {
                canvas = surfaceHolder.lockCanvas(null)
                val clipPath=Path()
                //to simplify clipped fixed coordinates circle
                clipPath.addCircle(100f,100f,300f,Path.Direction.CW)
                canvas!!.clipPath(clipPath)
                surfaceHolder.unlockCanvasAndPost(canvas)
            }
        }
    }
}

SurfaceView реализован как cutomView и добавлен в activity_main.xml:

<com.example.customcomponent.CircleSurfaceView
android:id="@+id/circleSurfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />

Но в результате получается только черный экран.

Вопрос: Как обеспечить наложение двух видео с возможностью перемещения обрезанной области? (Любой котлин или ява)

Спасибо!

...