Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在HW模式下创建OMXCodec编码器_Android_Video_Android Ndk_Hardware Acceleration_Stagefright - Fatal编程技术网

Android 在HW模式下创建OMXCodec编码器

Android 在HW模式下创建OMXCodec编码器,android,video,android-ndk,hardware-acceleration,stagefright,Android,Video,Android Ndk,Hardware Acceleration,Stagefright,我正在尝试在Android ICS 4.0.4上实现硬件加速的H264视频编码。由于MediaCodec类不可用,我必须使用stagefright API。但当我12月份设置硬件标记时,OMXCodec::Create总是返回NULL。 如果我12月份调用带有标志的OMXCodec::findMatchingCodecs(),我会得到以下列表: -OMX.TI.DUCATI1.VIDEO.H264E -OMX.qcom.7x30.video.encoder.avc -OMX.qcom.video

我正在尝试在Android ICS 4.0.4上实现硬件加速的H264视频编码。由于MediaCodec类不可用,我必须使用stagefright API。但当我12月份设置硬件标记时,OMXCodec::Create总是返回NULL。 如果我12月份调用带有标志的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.编码器
-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;            
}        
}

在Android中,编解码器注册是静态的,即所有编解码器都注册为数组的一部分

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

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

要检查创建了哪个编解码器,您可以在
OMXCodec.cpp
文件中启用日志,方法是删除行中的注释为
#define LOG\NDEBUG 0
,保存并重新编译以构建
libstagefright。因此,
可用于在
logcat
屏幕上生成日志

编辑:

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


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

非常感谢您的详细解释。但问题实际上是——为什么不可能创建硬件加速编解码器。我想如果/system/lib文件夹中缺少stagefrighthw.so文件,则不支持HW cdec。是吗?@user2199593。。如果没有
libstagefrighthw.so
,则
OMX
核心未初始化,因此无法实例化任何硬件组件,即
OMX
组件。所以你的怀疑是对的。@Ganesh关于使用h264解码附件B格式的流帧,我有一个类似的问题。。。你能回复pl吗?@Nikhillite。。我已经更新了我的回复。如果它回答了你的问题,请告诉我。除此之外,请详细说明您的问题。
         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);