3

Androidでffmpegとopenslesを使用してオーディオストリームを再生しようとしています。そして問題は、デコードされた再サンプリングされたフレームをffmpegからopenslesに渡すときに、聞こえる音がロボットのように聞こえ、引っかき傷があるようです。

ffmpeg からデコードされたフレーム:

PCM
48000 Hz
S16p

この場合、Opensles が必要です。

PCM
48000 Hz
S16

Opensles のセットアップ:

SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 255};

SLDataFormat_PCM format_pcm = { SL_DATAFORMAT_PCM, 2 , SL_SAMPLINGRATE_48, SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16,
                SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT, SL_BYTEORDER_LITTLEENDIAN};

SLDataSource audioSrc = {&loc_bufq, &format_pcm};

これは、opensles へのリサンプリングとエンキューの擬似コードです。

#define OPENSLES_BUFLEN 10
#define MAX_AUDIO_FRAME_SIZE 192000

DECLARE_ALIGNED(16,uint8_t,audio_buffer)[MAX_AUDIO_FRAME_SIZE * OPENSLES_BUFLEN];


int decode_audio(AVCodecContext * ctx, SwrContext *swr_context, AVPacket *packet, AVFrame * frame){
    int got_frame_ptr;
    int len = avcodec_decode_audio4(ctx, frame, &got_frame_ptr, packet);

    if(!got_frame_ptr)
        return -ERROR;

    int original_data_size = av_samples_get_buffer_size(NULL, ctx->channels,
        frame->nb_samples, ctx->sample_fmt, 1);

    uint8_t *audio_buf;
    int data_size;

    if (swr_context != NULL) {
        uint8_t *out[] = { audio_buffer };

        int sample_per_buffer_divider = 2* av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);;


        int len2 = swr_convert(swr_context, out,
            sizeof(audio_buffer) / sample_per_buffer_divider,
            frame->extended_data, frame->nb_samples);



        if (len2 < 0) {
            return -ERROR;
        }
        if (len2 == sizeof(audio_buffer) / sample_per_buffer_divider) {
            swr_init(swr_context);
        }
        audio_buf = audio_buffer;
        data_size = len2 * sample_per_buffer_divider;
        } 
     else {
        audio_buf = frame->data[0];
        data_size = original_data_size;
     }

     (*opengSLESData->bqPlayerBufferQueue)->Enqueue(opengSLESData->bqPlayerBufferQueue, audio_buf, data_size)


}

助けていただければ幸いです、ありがとう。

4

1 に答える 1