I’m trying to create a custom AudioFormatReader, then registered with AudioFormatManager. But when the audio is played, it has no sound. Here’s my implementation:
bool readSamples(int* const* destChannels, int numDestChannels, int startOffsetInDestBuffer,
int64 startSampleInFile, int numSamplesToRead) override {
if (!codec || numDestChannels <= 0)
return false;
const int bytesPerSample = bitsPerSample / 8;
const size_t bufferSize = numSamplesToRead * numChannels * bytesPerSample;
std::vector<uint8_t> buffer(bufferSize);
readAudioData(startSampleInFile, numSamplesToRead, buffer.data());
// Convert interleaved audio buffer into per-channel buffer
for (int sampleIdx = 0; sampleIdx < numSamplesToRead; ++sampleIdx)
{
for (int channel = 0; channel < numDestChannels; ++channel)
{
int sampleOffset = sampleIdx * numChannels + channel;
destChannels[channel][startOffsetInDestBuffer + sampleIdx] = reinterpret_cast<int16_t*>(buffer.data())[sampleOffset];
}
}
return true;
}
bool readAudioData(int64 startSample, int numSamples, uint8_t* buffer)
{
AMediaExtractor_seekTo(extractor, startSample * 1000000 / sampleRate, AMEDIAEXTRACTOR_SEEK_CLOSEST_SYNC);
int bytesRead = 0;
while (bytesRead < numSamples)
{
ssize_t bufferIndex = AMediaCodec_dequeueInputBuffer(codec, 10000);
if (bufferIndex >= 0)
{
size_t bufferSize;
uint8_t* inputBuffer = AMediaCodec_getInputBuffer(codec, bufferIndex, &bufferSize);
int sampleDataSize = AMediaExtractor_readSampleData(extractor, inputBuffer, bufferSize);
if (sampleDataSize < 0)
{
AMediaCodec_queueInputBuffer(codec, bufferIndex, 0, 0, 0, AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM);
break;
}
AMediaCodec_queueInputBuffer(codec, bufferIndex, 0, sampleDataSize, AMediaExtractor_getSampleTime(extractor), 0);
AMediaExtractor_advance(extractor);
}
AMediaCodecBufferInfo bufferInfo;
ssize_t outputBufferIndex = AMediaCodec_dequeueOutputBuffer(codec, &bufferInfo, 10000);
if (outputBufferIndex >= 0)
{
size_t outputSize;
uint8_t* outputBuffer = AMediaCodec_getOutputBuffer(codec, outputBufferIndex, &outputSize);
size_t copySize = std::min(outputSize, (size_t)(numSamples - bytesRead) * numChannels * (bitsPerSample / 8));
memcpy(buffer + bytesRead, outputBuffer, copySize);
bytesRead += copySize;
AMediaCodec_releaseOutputBuffer(codec, outputBufferIndex, false);
}
}
return true;
}
If there’s anything wrong, please let me know. Thanks