ijkplayer源码---FFPlayer结构体4 SDL_Aout

ijkplayer源码---FFPlayer结构体1_qq_15255121的专栏-CSDN博客

ijkplayer源码---FFPlayer结构体2_qq_15255121的专栏-CSDN博客

ijkplayer源码---FFPlayer结构体3 SDL_Vout_qq_15255121的专栏-CSDN博客

 SDL_Aout *aout;

aout是音频渲染

aout在那里赋值呢?

 IjkPlayer.java
@Override
public void prepareAsync() {
    try {
        mMediaPlayer.prepareAsync();
    } catch (IllegalStateException e) {
        mPlayerEventListener.onError();
    }
}


    IjkMediaPlayer.java
    public void prepareAsync() throws IllegalStateException {
    _prepareAsync();
}
    
        { "_prepareAsync",          "()V",      (void *) IjkMediaPlayer_prepareAsync },
    static void
IjkMediaPlayer_prepareAsync(JNIEnv *env, jobject thiz)
{
    MPTRACE("%s\n", __func__);
    int retval = 0;
    IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
    JNI_CHECK_GOTO(mp, env, "java/lang/IllegalStateException", "mpjni: prepareAsync: null mp", LABEL_RETURN);

    retval = ijkmp_prepare_async(mp);
    IJK_CHECK_MPRET_GOTO(retval, env, LABEL_RETURN);

LABEL_RETURN:
    ijkmp_dec_ref_p(&mp);
}

    
    int ijkmp_prepare_async(IjkMediaPlayer *mp)
{
    assert(mp);
    MPTRACE("ijkmp_prepare_async()\n");
    pthread_mutex_lock(&mp->mutex);
    int retval = ijkmp_prepare_async_l(mp);
    pthread_mutex_unlock(&mp->mutex);
    MPTRACE("ijkmp_prepare_async()=%d\n", retval);
    return retval;
}

    
    static int ijkmp_prepare_async_l(IjkMediaPlayer *mp){
            ......
                int retval = ffp_prepare_async_l(mp->ffplayer, mp->data_source);
    if (retval < 0) {
        ijkmp_change_state_l(mp, MP_STATE_ERROR);
        return retval;
    }
            ......
    }
    
    
    int ffp_prepare_async_l(FFPlayer *ffp, const char *file_name){
        
           if (!ffp->aout) {
        ffp->aout = ffpipeline_open_audio_output(ffp->pipeline, ffp);
        if (!ffp->aout)
            return -1;
    }     
    }    

通过上面的路径可以知道SDL_Aout在设置url后,异步prepare时赋值

我们在

IjkMediaPlayer *ijkmp_android_create(int(*msg_loop)(void*)){
    
    mp->ffplayer->pipeline = ffpipeline_create_from_android(mp->ffplayer);


}

IJKFF_Pipeline *ffpipeline_create_from_android(FFPlayer *ffp)
{

    pipeline->func_open_audio_output    = func_open_audio_output;

    return pipeline;
fail:
    ffpipeline_free_p(&pipeline);
    return NULL;
}

我们又知道

SDL_Aout *ffpipeline_open_audio_output(IJKFF_Pipeline *pipeline, FFPlayer *ffp)
{
    return pipeline->func_open_audio_output(pipeline, ffp);
}

 所以创建SDL_Aout的函数在

static SDL_Aout *func_open_audio_output(IJKFF_Pipeline *pipeline, FFPlayer *ffp)
{
    SDL_Aout *aout = NULL;
    if (ffp->opensles) {
        aout = SDL_AoutAndroid_CreateForOpenSLES();
    } else {
        aout = SDL_AoutAndroid_CreateForAudioTrack();
    }
    if (aout)
        SDL_AoutSetStereoVolume(aout, pipeline->opaque->left_volume, pipeline->opaque->right_volume);
    return aout;
}

可以看到有两种音频的方式opensles和AudioTrack

猜你喜欢

转载自blog.csdn.net/qq_15255121/article/details/123256841
SDL