【问题标题】:NDK OpenSL ES, seamless looping sounds using URI (non buffer) playerNDK OpenSL ES,使用 URI(非缓冲)播放器无缝循环声音
【发布时间】:2013-06-06 00:30:07
【问题描述】:

为了使用 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);

我得到“开始:0 结束:-1”,文件从开始到结束循环,而不是只循环一小部分(这就是我所追求的)。文档here 只提到了整个文件循环:

寻找

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

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

【问题讨论】:

    标签: android c android-ndk native-code opensl


    【解决方案1】:

    我认为这不适用于流,我尚未对其进行测试,但您可能必须缓冲整个声音数据才能进行持续时间选择。

    你得到的 -1 是 SL_TIME_UNKNOWN (0xFFFFFFFF 无符号),流的持续时间是未知的。如果您只需要文件的持续时间,它应该存在于标题中的某处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2011-08-27
      • 2013-07-19
      • 2012-07-04
      • 2013-01-01
      相关资源
      最近更新 更多