gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:19 24 4
gpt4 key购买 nike

我正在尝试在 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.编码器

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

当我在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);

最佳答案

Android ICS 4.0.4 中,编解码器注册是静态的,即所有编解码器都注册为数组 KEncoderInfo 的一部分找到 here .

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

由于您正在尝试使用 AVC 编码器,因此创建的软件编解码器将是 AVCEncoder,可以从 Factory 中找到。引用。

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

编辑:

如果是rtsp 流,需要在ACodec.cpp 中启用日志.

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

关于android - 在 HW 模式下创建 OMXCodec 编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19923412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com