bytedeco/javacv
View on GitHubHow can i convert avframe to ImageBitmap?(Compose for Desktop)
Open
#1,751 opened on Feb 13, 2022
help wantedquestion
Repository metrics
- Stars
- (6,985 stars)
- PR merge metrics
- (No merged PRs in 30d)
Description
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