bytedeco/javacv

How can i convert avframe to ImageBitmap?(Compose for Desktop)

Open

#1751 aperta il 13 feb 2022

Vedi su GitHub
 (3 commenti) (0 reazioni) (0 assegnatari)Java (1583 fork)batch import
help wantedquestion

Metriche repository

Star
 (6985 star)
Metriche merge PR
 (Nessuna PR mergiata in 30 g)

Descrizione

Here is an example code:

@Composable
fun App() {
    val videoUrl by remember { mutableStateOf("<videoUrl>") }
    var imageBitmap by remember { mutableStateOf<ImageBitmap?>(null) }

    LaunchedEffect(Unit) {
        val pFormatContext = avformat_alloc_context()

        avformat_open_input(pFormatContext, videoUrl, null, null)
        avformat_find_stream_info(pFormatContext, null as PointerPointer<*>?)


        var pCodecParameters = AVCodecParameters(null)
        for (i in 0 until pFormatContext.nb_streams()) {
            val pLocalCodecParameters = pFormatContext.streams(i).codecpar()

            if(pLocalCodecParameters.codec_type() == avutil.AVMEDIA_TYPE_VIDEO) {
                pCodecParameters = pLocalCodecParameters
            }
        }

        val pCodec = avcodec_find_decoder(pCodecParameters.codec_id())
        val pCodecContext = avcodec_alloc_context3(pCodec)
        avcodec_parameters_to_context(pCodecContext, pCodecParameters)
        avcodec_open2(pCodecContext, pCodec, null as PointerPointer<*>?)

        val pPacket = av_packet_alloc()
        val pFrame = avutil.av_frame_alloc()

        while(av_read_frame(pFormatContext, pPacket) >= 0) {
            avcodec_send_packet(pCodecContext, pPacket)
            avcodec_receive_frame(pCodecContext, pFrame)

            val buff = pPacket.data().position(0).capacity(pPacket.size().toLong()).asByteBuffer()
            val arr = ByteArray(buff.capacity())
            buff.get(arr)
            imageBitmap = Image.makeFromEncoded(arr).toComposeImageBitmap()
            delay(500)
        }
    }

    MaterialTheme {
        imageBitmap?.let {
            Image(
                bitmap = it,
                contentDescription = "Video"
            )
        }
    }
}

But it doesn't work

Guida contributor