opensles играют в pcm с неожиданным шумом - PullRequest
0 голосов
/ 15 мая 2019

Я использую ffmpeg для декодирования mp4 и получения AVFrame. Затем я отправляю AVFrame в поток OpenSLES в соответствии с очками. Но при воспроизведении некоторых видео произошел неожиданный шум. Мой код ниже. Спасибо!

enter image description here

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);
}
...