【问题标题】:Cannot play pcm > 60kb with the AndroidSimpleBufferQueue无法使用 AndroidSimpleBufferQueue 播放 pcm > 60kb
【发布时间】:2017-12-10 12:34:25
【问题描述】:

我已经初始化了一个 AndroidSimpleBufferQueue 例如值:

SLDataLocator_AndroidSimpleBufferQueue bufferLocator = {
  SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2};
SLDataFormat_PCM pcmFormat = {
  SL_DATAFORMAT_PCM,           1,
  SL_SAMPLINGRATE_44_1,        SL_PCMSAMPLEFORMAT_FIXED_16,
  SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER,
  SL_BYTEORDER_LITTLEENDIAN};

SLDataSource            audioSource      = {&bufferLocator, &pcmFormat};
SLDataLocator_OutputMix locatorOutputMix = {SL_DATALOCATOR_OUTPUTMIX,
                                            outputMixObj.getObject()};
SLDataSink audioSink = {&locatorOutputMix, nullptr};
[...]

然后,当我需要播放声音时,我会排队,例如:

bufferQueue->Enqueue(bufferQueue, (uint8_t*)buffer.data(),
          buffer.size())

它适用于小于 60k 的缓冲区,但是当缓冲区较大时,不会播放任何声音,或者有时只是一个伪影。

【问题讨论】:

    标签: android opensl


    【解决方案1】:

    来自规格:

    排队的缓冲区被原地使用,不需要 由设备复制,尽管这可能是 依赖于实现。应用程序开发人员应该知道 在缓冲区排队后修改缓冲区的内容是 未定义,可能导致音频损坏

    所以内存必须保持有效直到声音完全播放。

    阅读文档并注意意外的结构复制 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多