android nv21数据用mediacodec编解码

这篇具有很好参考价值的文章主要介绍了android nv21数据用mediacodec编解码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 Android 中使用 MediaCodec 进行 NV21 编码和解码的过程如下:

编码 NV21 数据:

// 创建 MediaCodec 编码器,并配置编码器格式和参数
val encoder = MediaCodec.createEncoderByType("video/avc")
val mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height)
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate)
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate)
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar)
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iframeInterval)
encoder.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)

// 启动编码器
encoder.start()

// 创建输入缓冲区和输出缓冲区
val inputBuffers = encoder.inputBuffers
val outputBuffers = encoder.outputBuffers

// 将 NV21 数据分割成 Y、U、V 平面
val yPlane = ByteArray(width * height)
val uvPlane = ByteArray(width * height / 2)
System.arraycopy(nv21Data, 0, yPlane, 0, width * height)
System.arraycopy(nv21Data, width * height, uvPlane, 0, width * height / 2)

// 编码循环
while (isEncoding) {
    // 获取空闲的输入缓冲区索引
    val inputBufferIndex = encoder.dequeueInputBuffer(-1)
    if (inputBufferIndex >= 0) {
        val inputBuffer = inputBuffers[inputBufferIndex]
        inputBuffer.clear()
        inputBuffer.put(yPlane) // 将 Y 平面数据放入输入缓冲区
        inputBuffer.position(0)
        encoder.queueInputBuffer(inputBufferIndex, 0, yPlane.size, presentationTimeUs, 0)
        presentationTimeUs += 1_000_000 / frameRate // 更新时间戳
    }

    // 获取编码后的输出数据
    var outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_US)
    while (outputBufferIndex >= 0) {
        val outputBuffer = outputBuffers[outputBufferIndex]
        // 处理编码后的输出数据

        // 释放输出缓冲区
        encoder.releaseOutputBuffer(outputBufferIndex, false)
        outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_US)
    }
}

// 停止编码器并释放资源
encoder.stop()
encoder.release()

解码编码后的数据:

// 创建 MediaCodec 解码器,并配置解码器格式和参数
val decoder = MediaCodec.createDecoderByType("video/avc")
val mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height)
mediaFormat.setByteBuffer("csd-0", csdBuffer) // 设置解码器参数
decoder.configure(mediaFormat, surface, null, 0) // 设置渲染 Surface
decoder.start()

// 解码循环
while (isDecoding) {
    // 获取空闲的输入缓冲区索引
    val inputBufferIndex = decoder.dequeueInputBuffer(-1)
    if (inputBufferIndex >= 0) {
        val inputBuffer = inputBuffers[inputBufferIndex]
        // 将解码后的数据放入输入缓冲区

        decoder.queueInputBuffer(inputBufferIndex, 0, data.size, timestamp, 0)
        timestamp += 1_000_000 / frameRate // 更新时间戳
    }

    // 获取解码后的输出数据
    var outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_US)
    while (outputBufferIndex >= 0) {
        val outputBuffer = outputBuffers[outputBufferIndex]
        // 处理解码后的输出数据

        // 渲染解码后的数据到 Surface
        decoder.releaseOutputBuffer(outputBufferIndex, true)
        outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_US)
    }
}

// 停止解码器并释放资源
decoder.stop()
decoder.release()

上述代码中的变量和参数需要根据你的实际情况进行调整。此外,NV21 格式的数据需要根据具体需要进行分割和处理传入编码器和解码器。文章来源地址https://www.toymoban.com/news/detail-636074.html

到了这里,关于android nv21数据用mediacodec编解码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FFmpeg 开发(14):Android FFmpeg + MediaCodec 实现视频硬解码

    FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 FFmpeg 开发(03):FFmpeg + OpenSLES 实现音频解码播放 FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放 FFmpeg 开发(05):FFmpeg + OpenGLES 实现视频解码播放和视频滤镜 FFmpeg 开发

    2024年02月09日
    浏览(40)
  • android nv21 转 yuv420sp

    上面两个函数的目标都是将NV21格式的数据转换为YUV420P格式,但是它们在处理U和V分量的方式上有所不同。 在第一个函数 NV21toYUV420P_1 中,U和V分量的处理方式是这样的:对于U分量,它从NV21数据的Y分量之后的每个奇数位置取数据;对于V分量,它从NV21数据的Y分量之后的每个偶

    2024年02月11日
    浏览(41)
  • 【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

    在讲NuPlayer时,NuPlayer解码部分会创建MediaCodec,并且最终到达OMX框架,先看MediaCodec的 init 函数 从init函数中可以看到,首先创建了 ACodec ,并且初始化了 ALooper 、 AMessage ,由于ACodec继承自 AHandler ,那么一套消息机制就有了。最后发送 kWhatInit 消息,收到消息的逻辑位于ACodec.

    2023年04月08日
    浏览(50)
  • Android和JNI交互 : 常见的图像格式转换 : NV21、RGBA、Bitmap等

    最近在使用 OpenCV 处理图片的时候,经常会遇到需要转换图像的情况,网上相关资料比较少,也不全,有时候得费劲老半天才能搞定。 自己踩了坑后,在这里记录下,都是我在项目中遇到的图像转化操作,是一些常用的图像格式转换操作。 具体包括: nv21、rgba、rgb 转换 OpenC

    2024年02月05日
    浏览(46)
  • Android JNI和原生交互,常见的图像格式转换 : NV21、RGBA、Bitmap等

    最近在使用 OpenCV 处理图片的时候,经常会遇到需要转换图像的情况,网上相关资料比较少,也不全,有时候得费劲老半天才能搞定。 自己踩了坑后,在这里记录下,都是我在项目中遇到的图像转化操作,是一些常用的图像格式转换操作。 具体包括: nv21、rgba、rgb 转换 OpenC

    2024年02月06日
    浏览(45)
  • yuv数据(nv12和nv21)和RGB数据之间转换的c++代码

    nv21 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y V U V U V U V U nv21 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U V U V U V U V 主要就是UV的顺序不同,交互一下UV的位置就可以互换NV12和NV21. 一般手机等移动端的数据流格式都是yuv格式,而神经网络的输入一般都是rgb格式,所以需要进行转换,这里给出c++的代码示例。 cv

    2024年02月11日
    浏览(43)
  • 【Unity-Shader脚本】0基础学会通过用Unity-Shader脚本渲染图像数据(NV21,NV12,RGBA数据)详细教程--附demo,NV21测试图像,YUV图像查看器。

      最近有一个需求是需要我在Unity中将获取到的图像数据来展示在Unity的界面之中。功能其实很简单,熟悉Unity-Shader的小伙伴可能很快就可以做出来。然而我很少和图像的渲染打交道,基本上是0基础了,在做这个需求之前连Shader是什么都不知道。本文记录了自己做这个需求

    2024年02月03日
    浏览(57)
  • 21.12 Python 实现网站服务器

    Web服务器本质上是一个提供Web服务的应用程序,运行在服务器上,用于处理HTTP请求和响应。它接收来自客户端(通常是浏览器)的HTTP请求,根据请求的URL、参数等信息生成HTTP响应,并将响应返回给客户端,完成客户端的请求。Web服务器可以使用多种编程语言和技术实现,通

    2024年02月06日
    浏览(35)
  • MediaCodec 低延时解码

    我们在使用Android的硬解进行解码时,如果是Android11以上则可以使用其特性低延迟,谷歌官方文档 以下是Android 11支持的低时延特性: ANGLE支持:Android 11引入了ANGLE(Almost Native Graphics Layer Engine)支持,它是一个开源的跨平台图形引擎,可以将OpenGL ES和Vulkan API转换为DirectX API。

    2024年02月14日
    浏览(37)
  • java jni nv21和nv12互转

    目录 nv12和nv21效果比较, libyuv性能比较 NV12 NV21 YUV420格式介绍 jni YUV420toYUV420SemiPlanar java YUV420toYUV420SemiPlanar

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包