4

我正在尝试在 Android ICS 4.0.4 上实现硬件加速的 H264 视频编码。由于 MediaCodec 类不可用,我必须使用 stagefright API。但是当我设置HardwareCodecsOnly标志时,OMXCodec::Create 总是返回 NULL。如果我用标志 kHardwareCodecsOnly 调用 OMXCodec::findMatchingCodecs(),我得到以下列表:
- OMX.TI.DUCATI1.VIDEO.H264E
- OMX.qcom.7x30.video.encoder.avc
- OMX.qcom.video.encoder.avc
- OMX.TI.Video.encoder
- OMX.Nvidia.h264.encoder
- OMX.SEC.AVC.Encoder

所以我想这意味着硬件支持硬件编码。

当我在OMXCodec::Create中没有设置任何标志时- 编解码器创建得很好,但我猜它处于软件模式(顺便说一句,我如何检查 - 究竟创建了哪个编解码器?)

浏览 OMXCodec 源代码我发现了有趣的行:

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

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

这是创建 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);
4

1 回答 1

5

其中Android ICS 4.0.4,编解码器注册是静态的,即所有编解码器都注册为数组的一部分,KEncoderInfo可以在此处找到。

区分编解码器的hardware方法software非常简单。如果组件名称不以 开头OMX,则将其解释为方法software中所示的编解码器IsSoftwareCodec

由于您正在尝试AVC编码器,因此如果创建了软件编解码器,则AVCEncoder可以从它的Factory参考资料中找到。

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

编辑:

rtsp流式传输的情况下,需要启用登录ACodec.cpp

需要确定是否libstagefrighthw.so存在将向框架/system/lib注册的OMX核心。Stagefright

于 2013-11-19T17:11:05.787 回答