Android:MPEG4Writer在使用OMXCodec作为媒体源时无法启动
我试图从字节数组缓冲区对视频进行编码,为此,我使用本机代码中的Android:MPEG4Writer在使用OMXCodec作为媒体源时无法启动,android,c++,android-ndk,stagefright,openmax,Android,C++,Android Ndk,Stagefright,Openmax,我试图从字节数组缓冲区对视频进行编码,为此,我使用本机代码中的MPEG4WriterAPI 我已经创建了自定义的MediaSource类来提供数据,并将其包装为OMXCodec,以将其提供给MPEG4Writer: sp<MediaSource> mVideoEncoder = OMXCodec::Create(client.interface(), omxEncMeta, true, mVideoOutSource); mVideoEncoder->start(); int
MPEG4Writer
API
我已经创建了自定义的MediaSource
类来提供数据,并将其包装为OMXCodec
,以将其提供给MPEG4Writer
:
sp<MediaSource> mVideoEncoder = OMXCodec::Create(client.interface(), omxEncMeta, true, mVideoOutSource);
mVideoEncoder->start();
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!");
}
但是当我调用start()
方法时,它返回错误代码UNKNOWN\u error
相反,如果我尝试直接给MPEG4Writer
我的自定义MediaSource
(不使用OMXCodec
包装它,它会成功启动,但最终会停止录制,并出现错误缺少编解码器特定数据
(大约12帧后),我想这是因为我的自定义MediaSource
只提供了关于实际帧的信息,而没有提供任何关于编解码器格式的信息
我确信我在OMXCodec
中遗漏了一些东西,但我不知道是什么…有没有人可以为我提供一个自定义MediaSource
编码的工作示例?或者给我一些提示,说明为什么这根本不起作用?如果你需要更多的信息,尽管问,谢谢 编辑:我是根据API 14开发的,所以请不要建议我使用API 16:)中的
MediaCodec
)
编辑:我就是这样开始的MPEG4Writer
:
sp<MediaSource> mVideoEncoder = OMXCodec::Create(client.interface(), omxEncMeta, true, mVideoOutSource);
mVideoEncoder->start();
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!");
}
我认为有一个错误很重要:
omxEncMeta->setInt32(kKeyBitRate, frameRate); // should set bitrate, 24 is too small
也
然后:确保你的来源返回这个
virtual sp<MetaData> getFormat() {
sp<MetaData> meta = new MetaData;
meta->setInt32(kKeyWidth, mWidth);
meta->setInt32(kKeyHeight, mHeight);
meta->setInt32(kKeyColorFormat, mColorFormat);
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
return meta;
}
virtual sp getFormat(){
sp meta=新元数据;
meta->setInt32(kKeyWidth,mWidth);
meta->setInt32(kKeyHeight,mHHEIGHT);
meta->setInt32(kKeyColorFormat,mColorFormat);
meta->setCString(kKeyMIMEType、媒体MIMETYPE、视频RAW);
返回元;
}
从源代码返回的MediaBuffer的大小应该是正确的:480*360*4(我认为是这样)
您应该提供adb logcat输出:adb.exe logcat OMXClient:V OMXCodec:V*:W我刚刚解决了我的(哑)问题:我在mvideocoder
上调用start()
(OMXCodec实例),然后在MPEG4Writer
上调用start()
,这就产生了未知错误
我只在
MPEG4Writer
实例上调用start()
解决了这个问题。谢谢你的回答,关于kKeyBitRate
你是对的(我想我复制粘贴错了:/)但也要解决这个问题,并确保我的自定义源返回与您建议的MPEG4Writer
无法启动的MetaData
相同的。。。我已经用logcat输出更新了我的问题。同样关于MediaBuffer
大小:对于Yuv420semiPlana
,我认为应该是(宽度*高度*3)/2
,不管怎样,我也尝试了宽度*高度*4
,但没有任何改变……不管怎样,我刚刚发现这是一个非常愚蠢的错误。。。无论如何,谢谢你的帮助,它非常有用!:)
virtual sp<MetaData> getFormat() {
sp<MetaData> meta = new MetaData;
meta->setInt32(kKeyWidth, mWidth);
meta->setInt32(kKeyHeight, mHeight);
meta->setInt32(kKeyColorFormat, mColorFormat);
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_RAW);
return meta;
}