为了使用OpenSL ES的URI播放器获得无缝循环,我尝试运行代码,取自this问题(查询音频长度):
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”,文件从头到尾循环,而不只是循环一个小部分(这就是我所追求的)。文档here仅提及整个文件循环:
求
SetLoop启用整个文件循环。 startPos参数应该是 零和endPos参数应为SL_TIME_UNKNOWN。
但它并没有特别说不支持循环文件的一部分。有人有这个成功吗?或者可以验证OpenSL ES Android实现不支持此功能吗?
答案 0 :(得分:0)
我不认为这适用于流,我没有测试它,但你可能必须在整个声音数据中缓冲以进行持续时间选择。
你得到的-1是SL_TIME_UNKNOWN(0xFFFFFFFF unsigned),流的持续时间是未知的。如果你只需要文件的持续时间,它应该存在于某个地方的标题中。