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