NDK OpenSL ES,无缝循环声音使用URI(非缓冲)播放器



为了使用OpenSL ES的URI播放器获得无缝循环,我尝试运行代码,取自这个问题(查询音频的长度):

SLmillisecond msec;
result = (*fdPlayerPlay)->GetDuration(fdPlayerPlay, &msec);
assert(SL_RESULT_SUCCESS == result);
__android_log_print(ANDROID_LOG_DEBUG, "NDK_debug_tag: ", "fdPlayerPlay GetDuration msec: %d", (int)msec);

结果是-1,无论如何

除了整个文件循环工作之外,我似乎什么都找不到。当我设置循环时:

// enable whole file looping
result = (*uriPlayerSeek)->SetLoop(uriPlayerSeek, SL_BOOLEAN_TRUE, 0, 200);
assert(SL_RESULT_SUCCESS == result);

然后查询循环点:

    SLboolean b;
    SLmillisecond start;
    SLmillisecond end;
    result = (*uriPlayerSeek)->GetLoop(uriPlayerSeek, &b, &start, &end);
    assert(SL_RESULT_SUCCESS == result);
    __android_log_print(ANDROID_LOG_DEBUG, "NDK_debug_tag: ", "start: %d end: %d", (int)start, (int)end);

我得到"start: 0 end: -1",文件从开始到结束循环,而不是只循环一小段(这是我所追求的)。这里的文档只提到了整个文件循环:

寻求

SetLoop启用整个文件循环。startPos参数应该是0, endPos参数应为SL_TIME_UNKNOWN。

但是它并没有明确说明不支持文件的循环部分。有人在这方面取得过成功吗?或者可以验证OpenSL ES Android实现不支持此功能?

我不认为这适用于流,我没有测试过它,但你可能不得不缓冲在整个声音数据做持续时间的选择。

得到的-1是SL_TIME_UNKNOWN (0xFFFFFFFF unsigned),流的持续时间是未知的。如果你只需要文件的持续时间,它应该存在于头文件的某个地方。

最新更新