登录
首页 >  Golang >  Go问答

将 C.AVFrame* 转换为 image.Image 的方法

来源:stackoverflow

时间:2024-03-04 23:21:26 161浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《将 C.AVFrame* 转换为 image.Image 的方法》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我有 C.AVFrame* 原始图像。

从 C.AVFrame* 转换为 jpg 后,我正在处理 jpg 解码后的 Go 图像。

有没有办法直接从 C.AVFrame* 创建 Go 镜像?


解决方案


这是一个很好的起点:https://github.com/nareix/joy4/blob/05a4ffbb53695aaacf9a2e2624472686280ab6dc/cgo/ffmpeg/video.go#L64-L88

*c.avframe 作为 frame 后,您可以:

func fromCPtr(buf unsafe.Pointer, size int) (ret []uint8) {
    hdr := (*reflect.SliceHeader)((unsafe.Pointer(&ret)))
    hdr.Cap = size
    hdr.Len = size
    hdr.Data = uintptr(buf)
    return
}


w := int(frame.width)
h := int(frame.height)
ys := int(frame.linesize[0])
cs := int(frame.linesize[1])

img = image.YCbCr{
    Y: fromCPtr(unsafe.Pointer(frame.data[0]), ys*h),
    Cb: fromCPtr(unsafe.Pointer(frame.data[1]), cs*h/2),
    Cr: fromCPtr(unsafe.Pointer(frame.data[2]), cs*h/2),
    YStride: ys,
    CStride: cs,
    SubsampleRatio: image.YCbCrSubsampleRatio420,
    Rect: image.Rect(0, 0, w, h),
}

将图像填充到实现 image.imageimage.ycbcr

到这里,我们也就讲完了《将 C.AVFrame* 转换为 image.Image 的方法》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>