Я использую ffmpeg для декодирования mp4 и получения AVFrame. Затем я отправляю AVFrame в поток OpenSLES в соответствии с очками. Но при воспроизведении некоторых видео произошел неожиданный шум. Мой код ниже. Спасибо!
void _playCallback(SLAndroidSimpleBufferQueueItf bq, void *context) {
auto player = (opensles_player *) context;
auto swrContext = ((opensles_player *) context)->swrContext;
auto queue = player->audioQueue;
auto frame = queue->pull();
if (frame != nullptr && swrContext != nullptr) {
int size = av_samples_get_buffer_size(nullptr,
av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO),
frame->nb_samples,
AV_SAMPLE_FMT_S16, 1);
if (size > 0) {
uint8_t *out_buffer = (uint8_t *) av_malloc(44100 * 2);
swr_convert(swrContext, &out_buffer, 44100, (const uint8_t
**) frame->data,
frame->nb_samples);
(*bq)->Enqueue(bq, out_buffer, size);
}
}
av_frame_free(&frame);
}