Actuellement, il ne prend en charge que 8 et 16 bits
Sources:
- Android code source (ligne 60)
- Article (Format de données PCM section)
Question
J'essaie de décoder un fichier FLAC avec un format d'échantillon 24 bits à l'aide d'OpenSl es sur Android. À l'origine, j'avais mon SLDataFormat_PCM
pour le SLDataSink
Configuration comme ceci.
_pcm.formatType = SL_DATAFORMAT_PCM;
_pcm.numChannels = 2;
_pcm.samplesPerSec = SL_SAMPLINGRATE_44_1;
_pcm.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
_pcm.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16;
_pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
Cela fonctionne bien pour essentiellement n'importe quel format de données. Heureusement le samplesPerSec
n'est pas respecté (je ne veux pas rééchantillonner).
Maintenant, je souhaite prendre en charge la profondeur de bits complète d'un fichier FLAC avec des échantillons 24 bits. Lorsque vous utilisez ce format, il effectue apparemment une conversion de profondeur, car une fois que je charge le fichier, puis vérifie le ANDROID_KEY_PCMFORMAT_BITSPERSAMPLE
Info, c'est 16.
Quand je mets bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_24;
ou SL_PCMSAMPLEFORMAT_FIXED_32
, alors OpenSl es le rejette
E/libOpenSLES(22706): pAudioSnk: bitsPerSample=32
W/libOpenSLES(22706): Leaving Engine::CreateAudioPlayer (SL_RESULT_CONTENT_UNSUPPORTED)
Une idée de la façon dont cela est censé fonctionner? Android est-il actuellement limité à 16 bits INT uniquement? J'accepterais également le flotteur 32 bits, mais je ne suppose pas que cela fonctionnera non plus.
La solution
Actuellement, il ne prend en charge que 8 et 16 bits
Sources: