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

ijkplayer源码---FFPlayer结构体1_qq_15255121的专栏-优快云博客

ijkplayer源码---FFPlayer结构体2_qq_15255121的专栏-优快云博客

ijkplayer源码---FFPlayer结构体3 SDL_Vout_qq_15255121的专栏-优快云博客

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值