Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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:MPEG4Writer在使用OMXCodec作为媒体源时无法启动_Android_C++_Android Ndk_Stagefright_Openmax - Fatal编程技术网

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;
}