【发布时间】:2020-12-16 15:02:53
【问题描述】:
我需要将数据传递给MediaExtractor,为此我使用此方法SetDataSource
https://developer.android.com/ndk/reference/group/media#amediaextractor_setdatasourcefd
像这样:
int32_t NDK_extractor::decode()
{
FILE *fp = nullptr;
media_status_t err;
AMediaExtractor *ex = AMediaExtractor_new();
fp = fopen("/storage/emulated/0/Android/data/com.test.debug/files/Models/test.mp3", "rb");
if (fp)
{
err = AMediaExtractor_setDataSourceFd(ex, fileno(fp), 0, dataSize);
}
else
{
LOGE("Failed open file");
return 0;
}
if (err != AMEDIA_OK)
{
LOGE("SOUND :: Error setting ex data source, err %d", err);
return 0;
}
...
}
它工作正常,但现在我需要使用指向数据和数据大小的指针,所以我改变了这个方法
int32_t NDK_extractor::decode()
{
FILE *fp = nullptr;
media_status_t err;
AMediaExtractor *ex = AMediaExtractor_new();
fp = fopen("/storage/emulated/0/Android/data/com.test.debug/files/Models/test.mp3", "rb");
fseek(fp, 0, SEEK_END);
long lSize = ftell(fp);
rewind(fp);
void *buf = new unsigned char[lSize];
fread(buf, 1, lSize, fp);
fclose(fp);
fp = fmemopen(buf, lSize, "r");
if (fp)
{
err = AMediaExtractor_setDataSourceFd(ex, fileno(fp), 0, dataSize);
}
else
{
LOGE("Failed open file");
return 0;
}
if (err != AMEDIA_OK)
{
LOGE("SOUND :: Error setting ex data source, err %d", err);
return 0;
}
...
}
所以,我在缓冲区中读取相同的数据(与前面的例子一样)也得到一个大小,然后我用fmemopen 打开它,结果得到这样的错误 - AMEDIA_ERROR_BASE
这里有什么问题?为什么它在一种情况下有效,而在另一种情况下却没有,尽管它几乎是一样的?我错过了什么?
【问题讨论】:
标签: android c++ native android-mediacodec