安卓:MPEG4Writer失败使用OMX codeC作为MediaSource的时候开始 [英] Android: MPEG4Writer fails to start when using OMXCodec as MediaSource

查看:1822
本文介绍了安卓:MPEG4Writer失败使用OMX codeC作为MediaSource的时候开始的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我试图连接code从字节数组视频缓冲和这样做,我使用的是从本地code MPEG4Writer API。

我创建我的自定义 MediaSource的类提供的数据,我与 OMX codeC 给它 MPEG4Writer

  SP<&MediaSource的GT; mVideoEn codeR = OMX codeC:创建(client.interface(),omxEncMeta,真实,mVideoOutSource);
mVideoEn codeR->启动();

mVideoOutSource 是我的自定义 MediaSource的类, omxEncMeta 如下:

  int32_t colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
int32_t宽度= 480;
int32_t高度= 360;
int32_t帧率= 24;
int32_t比特率= ​​500 * 1024;
int32_t iFrameInterval = 1;SP<元数据> omxEncMeta =新的元数据;
omxEncMeta-> setCString(kKeyMIMEType,MEDIA_MIMETYPE_VIDEO_AVC);
omxEncMeta-> setInt32(kKeyColorFormat,colorFormat);
omxEncMeta-> setInt32(kKeyWidth,宽度);
omxEncMeta-> setInt32(kKeyHeight,高度);
omxEncMeta-> setInt32(kKeyStride,宽度);
omxEncMeta-> setInt32(kKeySliceHeight,高度);
omxEncMeta-> setInt32(kKeyFrameRate,帧率);
omxEncMeta-> setInt32(kKeySampleRate,帧率);
omxEncMeta-> setInt32(kKeyBitRate,比特率);
omxEncMeta-> setInt32(kKeyIFramesInterval,iFrameInterval);

但是当我打电话的start()方法将返回错误code UNKNOWN_ERROR

相反,如果我尝试给 MPEG4Writer 直接我自定义的 MediaSource的(不带<$ C环绕它$ C> OMX codeC 启动成功,但最终会停止与误差缺少codeC的具体数据(约合后12帧),我想这是因为我的自定义 MediaSource的提供有关实际的帧,但有关codeC格式仅无关的信息。

我敢肯定,我的思念与 OMX codeC 的东西,但我无法找出...是否有任何人谁可以提供给我使用自定义 MediaSource的编码工作的例子?或者给我这是为什么不工作的一些提示?结果
如果你需要更多信息只是问,谢谢!

修改:我正在开发针对这14 API,所以请不要建议我使用媒体codeC 从16 API :)

修改:这是我如何我开始 MPEG4Writer

  int32_t OUTPUTFORMAT = OUTPUT_FORMAT_MPEG_4;
startTimeUs的int64_t = SYSTEMTIME()/ 1000;
int32_t totalBitRate =比特率;SP&LT;元数据&GT;元=新的元数据;
荟萃&GT; setInt64(kKeyTime,startTimeUs);
荟萃&GT; setInt32(kKeyFileType,OUTPUTFORMAT);
荟萃&GT; setInt32(kKeyBitRate,totalBitRate);SP&LT; MPEG4Writer&GT; mWriter =新MPEG4Writer(/ SD卡/ EN code_manual.mp4);
mWriter-&GT; ADDSOURCE(mVideoEn codeR);
status_t错误= mWriter-&GT;启动(meta.get());
如果(错误!= OK){
    LOGE(作家不被启动%X!,错误);
}其他{
    LOGI(作家开始了!);
}


这是logcat的输出(亚行logcat OMXClient:V OMX codeC:V *:W

  W /的ResourceType(370):跳过入门0x7f04002f封装表0,因为它并不复杂!
E /(4127):无法打开文件进行读取
E /(4127):无法打开文件进行读取
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):omx_video():内部构造函数()
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):omx_venc():内部component_init()
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_validate_profile_level(OMX_U32 *,OMX_U32 *):与返回eProfile = 1级= 4
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_open(OMX_U32)():初始化资料/级别设置成功
E / OMX-VENC-720P(155):vidc.venc.debug.sliceinfo值为0
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):Component_init返回值=为0x0
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):警告:请求的I / P BUFSIZE [40960],驱动程序更新后的I / P = BUFSIZE 262144
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_validate_profile_level(OMX_U32 *,OMX_U32 *):与返回eProfile = 1级= 256
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_set_param(无效*,OMX_INDEXTYPE)():资料/级别设置成功
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_validate_profile_level(OMX_U32 *,OMX_U32 *):与返回eProfile = 1级= 64
E / OMX-VENC-720P(155):在设定值(帧率)15
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_validate_profile_level(OMX_U32 *,OMX_U32 *):与返回eProfile = 1级= 64
E / OMX-VENC-720P(155):在设定值(比特率)15
E / OMX-VENC-720P(155):GET_PARAMETER:OMX_IndexParamVideoProfileLevelQuerySupported的输入端口返回简介:1,水平:2048
E / OMX-VENC-720P(155):资料/等级设置为1/64
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_validate_profile_level(OMX_U32 *,OMX_U32 *):与返回eProfile = 1级= 64
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):venc_set_intra_period:nPFrames = 25 nBFrames = 0
E / OMX-VENC-720P(155):BOOL venc_dev :: venc_validate_profile_level(OMX_U32 *,OMX_U32 *):与返回eProfile = 1级= 64
E / OMX-VENC-720P(155):在设定值(比特率)15
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_input_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_input_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_input_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_output_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):实际CNT = 5
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_output_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):实际CNT = 5
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_output_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):实际CNT = 5
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_output_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):实际CNT = 5
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):allocate_output_buffer()::
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):实际CNT = 5
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):无符号整型venc_dev :: venc_start()():检查资料/水平开始前驱动程序中设置
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):无符号整型venc_dev :: venc_start()():驱动程序配置文件[3] /水平[15]设置成功
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:$ C $抄送:2,个人3,等级:15
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:宽度:480,高度:360,FPS:25
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:比特率:512000,RC:3,I-期:25
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:QPI:0,QPP:80,QPB:0
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:VOP_Resolution:4343391,片模式:1,Slize_Size:0
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:EntropyMode:1,CabacModel:0
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:DB模式:2,阿尔法:0,β:0
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):ENC_CONFIG:IntraMB /帧:18,HEC:843271745
E / OMX-VENC-720P(155):宽度480,高度360,w_round 480,h_round 368,yuv_size 294912对准8192数2
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):分配的virt:0x4432e000,FD:大小294912 145
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):分配的virt:0x4432e000,FD:大小294912 145在指数:0
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):分配的virt:0x44895000,FD:大小294912 147
E / OMX-VENC-720P(155):
E / OMX-VENC-720P(155):分配的virt:0x44895000,FD:大小294912 147索引:1
E / TestEnc-JNI(4127):作家不能开始! 8000


解决方案

我只是想出了我(的的)问题:我打电话的start() mVideoEn codeR (即 OMX codeC 实例)调用<$ C $前C>的start()在 MPEG4Writer ,这是给 UNKNOWN_ERROR

我致电解决开始()仅在 MPEG4Writer 实例。

I'm trying to encode a video from a byte array buffer and to do so I'm using MPEG4Writer API from native code.

I have created my custom MediaSource class to provide the data and I'm wrapping it with OMXCodec to give it to MPEG4Writer:

sp<MediaSource> mVideoEncoder = OMXCodec::Create(client.interface(), omxEncMeta, true, mVideoOutSource);
mVideoEncoder->start();

mVideoOutSource is my custom MediaSource class, omxEncMeta is the following:

int32_t colorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
int32_t width = 480;
int32_t height = 360;
int32_t frameRate = 24;
int32_t bitRate = 500 * 1024;
int32_t iFrameInterval = 1;

sp<MetaData> omxEncMeta = new MetaData;
omxEncMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
omxEncMeta->setInt32(kKeyColorFormat, colorFormat);
omxEncMeta->setInt32(kKeyWidth, width);
omxEncMeta->setInt32(kKeyHeight, height);
omxEncMeta->setInt32(kKeyStride, width);
omxEncMeta->setInt32(kKeySliceHeight, height);
omxEncMeta->setInt32(kKeyFrameRate, frameRate);
omxEncMeta->setInt32(kKeySampleRate, frameRate);
omxEncMeta->setInt32(kKeyBitRate, bitRate);
omxEncMeta->setInt32(kKeyIFramesInterval, iFrameInterval);

but when I call start() method it returns the error code UNKNOWN_ERROR.

Instead, if I try to give to MPEG4Writer directly my custom MediaSource (without wrapping it with OMXCodec it starts successfully but eventually it will stop recording with the error Missing codec specific data (after about 12 frames), and I think this is because my custom MediaSource provides only informations about the actual frames but nothing about the codec format.

I'm sure I'm missing something with OMXCodec, but I can't figure out what... Is there anyone who could provide me with a working example of a custom MediaSource for encoding? Or give me some hints on why this is not working at all?
If you need more informations just ask, thanks!

EDIT: I'm developing this against API 14 so please don't suggest me to use MediaCodec from API 16 :)

EDIT: This is how I'm starting MPEG4Writer:

int32_t outputFormat = OUTPUT_FORMAT_MPEG_4;
int64_t startTimeUs = systemTime() / 1000;
int32_t totalBitRate = bitRate;

sp<MetaData> meta = new MetaData;
meta->setInt64(kKeyTime, startTimeUs);
meta->setInt32(kKeyFileType, outputFormat);
meta->setInt32(kKeyBitRate, totalBitRate);

sp<MPEG4Writer> mWriter = new MPEG4Writer("/sdcard/encode_manual.mp4");
mWriter->addSource(mVideoEncoder);
status_t error = mWriter->start(meta.get());
if (error != OK) {
    LOGE("Writer NOT started! %x", error);
} else {
    LOGI("Writer started!");
}


This is the output of logcat (adb logcat OMXClient:V OMXCodec:V *:W):

W/ResourceType(  370): Skipping entry 0x7f04002f in package table 0 because it is not complex!
E/        ( 4127): Can't open file for reading
E/        ( 4127): Can't open file for reading
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  omx_video(): Inside Constructor()
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  omx_venc(): Inside component_init()
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 4
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  bool venc_dev::venc_open(OMX_U32)(): Init Profile/Level setting success
E/OMX-VENC-720p(  155): vidc.venc.debug.sliceinfo value is 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Component_init return value = 0x0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): WARNING: Requested i/p bufsize[40960],Driver's updated i/p bufsize = 262144
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 256
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  bool venc_dev::venc_set_param(void*, OMX_INDEXTYPE)(): Profile/Level setting success
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155): Calling set level (Framerate) with 15
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155): Calling set level (Bitrate) with 15
E/OMX-VENC-720p(  155): get_parameter: OMX_IndexParamVideoProfileLevelQuerySupported for Input port returned Profile:1, Level:2048
E/OMX-VENC-720p(  155): Profile/Level set equal to 1/64
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  venc_set_intra_period: nPFrames = 25 nBFrames = 0
E/OMX-VENC-720p(  155): bool venc_dev::venc_validate_profile_level(OMX_U32*, OMX_U32*): Returning with eProfile = 1Level = 64
E/OMX-VENC-720p(  155): Calling set level (Bitrate) with 15
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_input_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_input_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_input_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  allocate_output_buffer()::
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  actual cnt = 5
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  unsigned int venc_dev::venc_start()(): Check Profile/Level set in driver before start
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  unsigned int venc_dev::venc_start()(): Driver Profile[3]/Level[15] successfully SET
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: Codec: 2, Profile 3, level : 15
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  ENC_CONFIG: Width: 480, Height:360, Fps: 25
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: Bitrate: 512000, RC: 3, I-Period: 25
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: qpI: 0, qpP: 80, qpb: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: VOP_Resolution: 4343391, Slice-Mode: 1, Slize_Size: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: EntropyMode: 1, CabacModel: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: DB-Mode: 2, alpha: 0, Beta: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155): ENC_CONFIG: IntraMB/Frame: 18, HEC: 843271745
E/OMX-VENC-720p(  155): Width 480, Height 360, w_round 480, h_round 368, yuv_size 294912 alignment 8192 count 2
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x4432e000, FD: 145 of size 294912
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x4432e000, FD: 145 of size 294912 at index: 0
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x44895000, FD: 147 of size 294912
E/OMX-VENC-720p(  155):
E/OMX-VENC-720p(  155):  Allocated virt:0x44895000, FD: 147 of size 294912 at index: 1
E/TestEnc-JNI( 4127): Writer NOT started! 80000000

解决方案

I just figured out my (dumb) issue: I was calling start() on mVideoEncoder (the OMXCodec instance) before calling start() on MPEG4Writer, and this was giving the UNKNOWN_ERROR.

I solved by calling start() only on MPEG4Writer instance.

这篇关于安卓:MPEG4Writer失败使用OMX codeC作为MediaSource的时候开始的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆