如果我用标志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编码器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)