android– 使用带有MediaCodec的getInputImage进行编码

android– 使用带有MediaCodec的getInputImage进行编码,第1张

概述背景:我做视频文件解复用,解码视频轨道,对接收到的帧应用一些更改,再次解码和复用它们.在Android中执行此 *** 作的已知问题是供应商指定编码器/解码器颜色格式的数量.Android4.3引入了表面以使设备独立,但我发现很难使用它们,因为我的帧更改例程需要Canvas写入.自Android5.0以来,

背景:我做视频文件解复用,解码视频轨道,对接收到的帧应用一些更改,再次解码和复用它们.

在Android中执行此 *** 作的已知问题是供应商指定编码器/解码器颜色格式的数量. AndroID 4.3引入了表面以使设备独立,但我发现很难使用它们,因为我的帧更改例程需要Canvas写入.

自AndroID 5.0以来,使用灵活的YUV420颜色格式很有前途.与用于解码的getoutputimage和用于编码的getInputimage一起,Image对象可以用作从解码MediaCodec检索的格式.我使用getoutputimage进行解码工作,并可以在RGB转换后可视化结果.为了编码YUV图像并将其排队到MediaCodec(编码器),似乎缺少链接:

从MediaCodec中取出输入缓冲区后

int inputBufferID = encoder.dequeueinputBuffer (5000);

我可以访问返回的正确图像

encoder.getInputimage (inputBufferID);

我填写图像缓冲区 – 这也工作,但我没有看到一种方法将输入缓冲区排队回编解码器进行编码…只有一个

encoder.queueinputBuffer (inputBufferID, position, size, presentationUs, 0);

方法可用,但没有任何匹配图像.可以使用检索呼叫所需的大小

ByteBuffer  byteBuffer = encoder.getinputBuffer (inputBufferID);

byteBuffer.remaining ();

但是除了getInputimage()之外,这似乎会在调用时搞砸编码器.

另一个缺少的文档或者我错了什么?

解决方法:

这确实有点问题 – 最简单的方法可能是计算Image中任何平面的起始指针与任何平面的最后一个字节之间的最大距离,但是你需要本机代码才能这样做(为了获得直接字节缓冲区的实际指针值).

第二种方法是在显示时使用getinputBuffer,但有一点需要注意.首先调用getinputBuffer获取ByteBuffer并在其上调用remaining(). (或者也许capacity()效果更好?).只有在此之后,才调用getInputimage.细节是,当调用getInputimage时,getinputBuffer返回的ByteBuffer会失效,反之亦然. (文档说“在调用此方法之后,任何先前为相同输入索引返回的ByteBuffer或Image对象必须不再使用.”​​在MediaCodec.getInputBuffer(int)中.)

总结

以上是内存溢出为你收集整理的android – 使用带有MediaCodec的getInputImage进行编码全部内容,希望文章能够帮你解决android – 使用带有MediaCodec的getInputImage进行编码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1108249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存