I found that the avcodec_decode_audio3 function works slowly with the mp4 format, here is my code loop for decoding audio:
while (av_read_frame(av_format_context, &packet) >= 0 && is_play == 1) { if (av_codec_context->codec_type == AVMEDIA_TYPE_AUDIO && is_play == 1) { int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; int size = packet.size; int n; int dataLength = size; int decoded = 0; while (size > 0) { //start measure time gettimeofday(&tvBegin, NULL); int len = avcodec_decode_audio3(av_codec_context, (int16_t *) pAudioBuffer, &out_size, &packet); //stop measure time gettimeofday(&tvEnd, NULL); timeval_subtract(&tvDiff, &tvEnd, &tvBegin); LOGI("%d", tvDiff.tv_usec / 1000); LOGI("len='%d'", len); LOGI("out_size='%d'", out_size); if (len < 0) { break; return 1; } if (out_size > 0) { jbyte *bytes = (*env)->GetByteArrayElements(env, array, NULL); memcpy(bytes, (int16_t *) pAudioBuffer, out_size); (*env)->ReleaseByteArrayElements(env, array, bytes, 0); (*env)->CallVoidMethod(env, obj, play, array, out_size, is_play); } size -= len; } } if (packet.data) av_free_packet(&packet); }
But with other formats like flac and mp3, it works great. avcodec_decode_audio3 takes about 1-2 milliseconds to decode an mp3 frame with out_size = 4608, but with the same frame size in mp4 decoding, it takes about 6-7 milliseconds. I got my build script from here .
Is this normal behavior? Is there a way to increase mp4 decoding performance?
source share