android – 在HW模式下创建OMXCodec编码器

android – 在HW模式下创建OMXCodec编码器,第1张

概述我正在尝试在 Android ICS 4.0.4上实现HW加速的H264视频编码.由于MediaCodec类不可用,我必须使用stagefright API.但是当我输入HardwareCodecsOnly标志时,OMXCodec :: Create总是返回NULL. 如果我用标志kHardwareCodecsOnly调用OMXCodec :: findMatchingCodecs(),我得到以下 我正在尝试在 Android ICS 4.0.4上实现HW加速的H264视频编码.由于MediaCodec类不可用,我必须使用stagefright API.但是当我输入HarDWareCodecsOnly标志时,OMXCodec :: Create总是返回NulL.
如果我用标志kHarDWareCodecsOnly调用OMXCodec :: findMatchingCodecs(),我得到以下列表:
– OMX.TI.DUCATI1.VIDEO.H264E
– OMX.qcom.7×30.vIDeo.encoder.avc
– OMX.qcom.vIDeo.encoder.avc
– OMX.TI.VIDeo.encoder
– OMX.NvIDia.h264.encoder
– OMX.SEC.AVC.Encoder

所以我猜这意味着硬件支持HW编码.

当我在OMXCodec :: Create中没有放置标志时 – 编解码器创建得很好,但我猜它是在软件模式下
(顺便说一下,我该如何检查 – 确切地创建了哪个编解码器?)

浏览OMXCodec源我找到了有趣的行:

if (createEncoder) {            sp<MediaSource> softwareCodec = InstantiateSoftwareEncoder(componentname,source,Meta);    if (softwareCodec != NulL) {       LOGV("Successfully allocated software codec '%s'",componentname);    return softwareCodec;            }        }

对于Encoder来说,它总是首先尝试实例化软件编解码器.
我究竟做错了什么?任何帮助将不胜感激.谢谢

这是OMXCodec创建的代码:

mClIEnt = new OMXClIEnt();        mClIEnt->connect();     logger->log("mClIEnt.connect();");      enc_Meta = new MetaData;     // frame size of target vIDeo file    int wIDth = 640; //720;    int height = 480;     int kFramerate = 15;     int kVIDeoBitRate = 500000;     int kiframesIntervalSec = 5;     int32_t colorFormat = OMX_color_FormatYUV420SemiPlanar;    enc_Meta->setCString(kKeyMIMEType,MEDIA_MIMETYPE_VIDEO_AVC); //MEDIA_MIMETYPE_VIDEO_MPEG4); //MEDIA_MIMETYPE_VIDEO_H263);//MEDIA_MIMETYPE_VIDEO_AVC);    enc_Meta->setInt32(kKeyWIDth,wIDth);    enc_Meta->setInt32(kKeyHeight,height);    enc_Meta->setInt32(kKeyFrameRate,kFramerate);    enc_Meta->setInt32(kKeySampleRate,44100);    enc_Meta->setInt32(kKeyBitRate,kVIDeoBitRate);    enc_Meta->setInt32(kKeyStrIDe,wIDth);    enc_Meta->setInt32(kKeySliceHeight,height);    enc_Meta->setInt32(kKeyiframesInterval,kiframesIntervalSec);    enc_Meta->setInt32(kKeycolorFormat,colorFormat);  mVIDeoSource = OMXCodec::Create(            mClIEnt->interface(),enc_Meta,true,mSrc,NulL,OMXCodec::kHarDWareCodecsOnly );     logger->log("OMXCodec_CREATED result: %d",(mVIDeoSource!=NulL) ? 1 : 0);
解决方法 在AndroID ICS 4.0.4中,编解码器注册是静态的,即所有编解码器都被注册为数组KEncoderInfo的一部分,可以找到 here.

区分硬件和软件编解码器的方法非常简单.如果组件名称不是以OMX开头,则它被解释为软件编解码器,如IsSoftwareCodec方法所示.

由于您正在尝试AVC编码器,因此创建的软件编解码器将是AVCEncoder,可以从它的Factory参考中找到.

要检查创建了哪个编解码器,可以通过在this行中删除注释为#define LOG_NDEBUG 0来启用OMXCodec.cpp文件中的日志,保存并重新编译以构建libstagefright.so,这可用于在logcat屏幕上生成日志.

编辑:

在rtsp流式传输的情况下,需要在ACodec.cpp中启用日志.

需要确定/ system / lib中是否存在libstagefrighthw.so,它将使用Stagefright框架注册OMX核心.

总结

以上是内存溢出为你收集整理的android – 在HW模式下创建OMXCodec编码器全部内容,希望文章能够帮你解决android – 在HW模式下创建OMXCodec编码器所遇到的程序开发问题。

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

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

原文地址: https://www.outofmemory.cn/web/1129337.html

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

发表评论

登录后才能评论

评论列表(0条)

保存