bilibili / ijkplayer

Android/iOS video player based on FFmpeg n3.4, with MediaCodec, VideoToolbox support.
GNU General Public License v2.0
32.43k stars 8.11k forks source link

有时候 IjkVideoView.release(true) 方法耗时好几秒 #3048

Open zhanggao opened 7 years ago

zhanggao commented 7 years ago

播放网络视频,在视频未加载完成的情况下调用 release, release 方法有可能耗时好几秒。

zhanggao commented 7 years ago

05-05 20:00:17.980 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_profileBegin 05-05 20:00:17.980 31416-31416/com.test D/IJKMEDIA: monstartup: libijkplayer.so

05-05 20:00:18.313 31416-31416/com.test D/IJKMEDIA--: 这里调用了 IjkVideoView 的 setVideoPath

05-05 20:00:18.381 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_init 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_setup 05-05 20:00:18.382 31416-31416/com.test I/IJKMEDIA: av_version_info: ff3.2--ijk0.7.6--20170203--001 05-05 20:00:18.382 31416-31416/com.test I/IJKMEDIA: ijk_version_info: k0.7.8.1 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ffpipeline_create_from_android() 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque(0xcf2) 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque()=void 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque(0xcf2) 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque()=void 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback() 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_mediacodec_select_callback 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()=void 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_setLogLevel(6) 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: moncleanup 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.385 31416-31416/com.test D/tv.danmaku.ijk.media.player.IjkMediaPlayer: Couldn't open file on client side, trying server side 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setDataSourceAndHeaders 05-05 20:00:18.385 31416-31416/com.test V/IJKMEDIA: setDataSource: path https:// 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_data_source(url="https://xxx video url") 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_data_source(url="https://xxx video url")=0 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setVideoSurface 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0xffdd1230) 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_surface() 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0xffdd1230)=void 05-05 20:00:18.386 31416-31416/com.test W/tv.danmaku.ijk.media.player.IjkMediaPlayer: setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder 05-05 20:00:18.386 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_prepareAsync 05-05 20:00:18.386 31416-31416/com.test D/IJKMEDIA: ijkmp_prepare_async() 05-05 20:00:18.386 31416-413/com.test I/IJKMEDIA: SDL_RunThread: [413] ff_msg_loop 05-05 20:00:18.386 31416-413/com.test D/IJKMEDIA: message_loop 05-05 20:00:18.387 31416-413/com.test D/IJKMEDIA: FFP_MSG_FLUSH: 05-05 20:00:18.388 31416-31416/com.test D/IJKMEDIA: ijkmp_prepare_async()=0 05-05 20:00:18.388 31416-416/com.test I/IJKMEDIA: SDL_RunThread: [416] ff_vout 05-05 20:00:18.388 31416-417/com.test I/IJKMEDIA: SDL_RunThread: [417] ff_read 05-05 20:00:18.389 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 1 05-05 20:00:18.414 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 131073 05-05 20:00:18.450 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 131074

05-05 20:00:19.470 31416-31416/com.test D/IJKMEDIA--: 这里调用了 IjkVideoView 的 release(true) 方法 (此时视频没有加载出来)

05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_reset 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_release 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0) 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_surface() 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)=void 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:19.472 31416-413/com.test D/IJKMEDIA: message_loop exit 05-05 20:00:19.472 31416-413/com.test I/IJKMEDIA: SDL_JNI_DetachThreadEnv: [413] 05-05 20:00:19.472 31416-416/com.test I/IJKMEDIA: SDL_JNI_DetachThreadEnv: [416] // 这里为什么卡顿了一会儿,然后才有下面的log 05-05 20:00:23.637 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 131073 05-05 20:00:23.639 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 2 05-05 20:00:23.639 31416-417/com.test E/IJKMEDIA: https://xxx video url: Immediate exit requested 05-05 20:00:23.639 31416-417/com.test I/IJKMEDIA: SDL_JNI_DetachThreadEnv: [417] 05-05 20:00:23.640 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_setup 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ffpipeline_create_from_android() 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque(0xce2) 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque()=void 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque(0xce2) 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque()=void 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback() 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_mediacodec_select_callback 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()=void 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_dec_ref(): ref=0 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_release 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0) 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_surface() 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)=void 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_dec_ref(): ref=0 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void

05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA--: IjkVideoView 的 release(true) 方法执行完,耗时 4177 05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA--: 这里调用了 IjkMediaPlayer.native_profileEnd();

05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_profileEnd 05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA: moncleanup 05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA--: 全部执行完成

raymond1012 commented 7 years ago

源文件是比较大的mp4吗,如果是可能会有这个问题,ffmpeg的demux问题

2017-05-05 20:32 GMT+08:00 zhanggao notifications@github.com:

05-05 20:00:17.980 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayernative profileBegin 05-05 20:00:17.980 31416-31416/com.test D/IJKMEDIA: monstartup: libijkplayer.so

05-05 20:00:18.313 31416-31416/com.test D/IJKMEDIA--: 这里调用了 IjkVideoView 的 setVideoPath

05-05 20:00:18.381 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_init 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_setup 05-05 20:00:18.382 31416-31416/com.test I/IJKMEDIA: av_version_info: ff3.2--ijk0.7.6--20170203--001 05-05 20:00:18.382 31416-31416/com.test I/IJKMEDIA: ijk_version_info: k0.7.8.1 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ffpipeline_createfrom android() 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque(0xcf2) 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque()=void 05-05 20:00:18.382 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque(0xcf2) 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque()=void 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback() 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_mediacodec_select_callback 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()=void 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayernative setLogLevel(6) 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: moncleanup 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setOptionLong 05-05 20:00:18.383 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayersetOptionLong 05-05 20:00:18.385 31416-31416/com.test D/tv.danmaku.ijk.media.player.IjkMediaPlayer: Couldn't open file on client side, trying server side 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer setDataSourceAndHeaders 05-05 20:00:18.385 31416-31416/com.test V/IJKMEDIA: setDataSource: path https:// 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_data_source(url="https://xxx video url") 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_data_source(url="https://xxx video url")=0 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_setVideoSurface 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0xffdd1230) 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_surface() 05-05 20:00:18.385 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0xffdd1230)=void 05-05 20:00:18.386 31416-31416/com.test W/tv.danmaku.ijk.media.player.IjkMediaPlayer: setScreenOnWhilePlaying(true) is ineffective without a SurfaceHolder 05-05 20:00:18.386 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_prepareAsync 05-05 20:00:18.386 31416-31416/com.test D/IJKMEDIA: ijkmp_prepare_async() 05-05 20:00:18.386 31416-413/com.test I/IJKMEDIA: SDL_RunThread: [413] ff_msg_loop 05-05 20:00:18.386 31416-413/com.test D/IJKMEDIA: message_loop 05-05 20:00:18.387 31416-413/com.test D/IJKMEDIA: FFP_MSG_FLUSH: 05-05 20:00:18.388 31416-31416/com.test D/IJKMEDIA: ijkmp_prepare_async()=0 05-05 20:00:18.388 31416-416/com.test I/IJKMEDIA: SDL_RunThread: [416] ff_vout 05-05 20:00:18.388 31416-417/com.test I/IJKMEDIA: SDL_RunThread: [417] ff_read 05-05 20:00:18.389 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 1 05-05 20:00:18.414 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 131073 05-05 20:00:18.450 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 131074

05-05 20:00:19.470 31416-31416/com.test D/IJKMEDIA--: 这里调用了 IjkVideoView 的 release(true) 方法 (此时视频没有加载出来)

05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_reset 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_release 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0) 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_surface() 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)=void 05-05 20:00:19.471 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:19.472 31416-413/com.test D/IJKMEDIA: message_loop exit 05-05 20:00:19.472 31416-413/com.test I/IJKMEDIA: SDL_JNI_DetachThreadEnv: [413] 05-05 20:00:19.472 31416-416/com.test I/IJKMEDIA: SDL_JNI_DetachThreadEnv: [416] // 这里为什么卡顿了一会儿,然后才有下面的log 05-05 20:00:23.637 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 131073 05-05 20:00:23.639 31416-417/com.test I/tv.danmaku.ijk.media.player.IjkMediaPlayer: onNativeInvoke 2 05-05 20:00:23.639 31416-417/com.test E/IJKMEDIA: https://xxx video url: Immediate exit requested 05-05 20:00:23.639 31416-417/com.test I/IJKMEDIA: SDL_JNI_DetachThreadEnv: [417] 05-05 20:00:23.640 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_native_setup 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ffpipeline_createfrom android() 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque(0xce2) 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ijkmp_set_inject_opaque()=void 05-05 20:00:23.641 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque(0xce2) 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_set_ijkio_inject_opaque()=void 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback() 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_mediacodec_select_callback 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_android_set_mediacodec_select_callback()=void 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_dec_ref(): ref=0 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:23.642 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayer_release 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0) 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ffpipeline_set_surface() 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_set_android_surface(surface=0x0)=void 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_dec_ref(): ref=0 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l() 05-05 20:00:23.643 31416-31416/com.test D/IJKMEDIA: ijkmp_shutdown_l()=void

05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA--: IjkVideoView 的 release(true) 方法执行完,耗时 4177 05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA--: 这里调用了 IjkMediaPlayer.native_profileEnd();

05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA: IjkMediaPlayernative profileEnd 05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA: moncleanup 05-05 20:00:23.647 31416-31416/com.test D/IJKMEDIA--: 全部执行完成

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/Bilibili/ijkplayer/issues/3048#issuecomment-299452555, or mute the thread https://github.com/notifications/unsubscribe-auth/AEOmlhLwhFC-jVhVDb8TSeeXRaIwUcaXks5r2xbogaJpZM4NR2kf .

zhanggao commented 7 years ago

不大,网络上的,时长就一两分钟。 请问这个问题是否有解决办法呢? @raymond1012

raymond1012 commented 7 years ago

先debug下是不是卡在mov.c 的mov_read_header

zhanggao commented 7 years ago

刚在mov_read_header里面加了log。在视频加载出来之前release,并没有走到 mov_read_header 这个函数里面。 正常播放后再release,是进了mov_read_header的,正常播放时mov_read_header函数大概耗时500毫秒。 release会卡顿好几秒,有时候5s以上。 看起来跟mov_read_header没什么关系。

raymond1012 commented 7 years ago

有调用mov_probe吗?

2017-05-08 14:59 GMT+08:00 zhanggao notifications@github.com:

刚在mov_read_header里面加了log。在视频加载出来之前release,并没有走到 mov_read_header 这个函数里面。 正常播放后再release,是进了mov_read_header的。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/Bilibili/ijkplayer/issues/3048#issuecomment-299788297, or mute the thread https://github.com/notifications/unsubscribe-auth/AEOmlpzQEUzr8ydJGrGFn5xouJMYMcWNks5r3r03gaJpZM4NR2kf .

zhanggao commented 7 years ago

mov_probe也没用调用。 测了很多次,调到mov_probe的情况下,release都没有卡顿。 release卡顿的情况下代码都没走到mov_probe里面。

raymond1012 commented 7 years ago

debug 下init_input函数看看具体哪里hang住了

2017-05-08 19:10 GMT+08:00 zhanggao notifications@github.com:

mov_probe也没用调用。 测了很多次,调到mov_probe的情况下,release都没有卡顿。 release卡顿的情况下代码都没走到mov_probe里面。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/Bilibili/ijkplayer/issues/3048#issuecomment-299839093, or mute the thread https://github.com/notifications/unsubscribe-auth/AEOmlvWFvQAyisKkoTabMxuuRlrsJ1tNks5r3vg3gaJpZM4NR2kf .

zhanggao commented 7 years ago

// 正常情况 init_input 走到最后一个return

static int init_input(AVFormatContext s, const char filename, AVDictionary **options) {

int ret;
AVProbeData pd = { filename, NULL, 0 };
int score = AVPROBE_SCORE_RETRY;

if (s->pb) {
    s->flags |= AVFMT_FLAG_CUSTOM_IO;
    if (!s->iformat)
        return av_probe_input_buffer2(s->pb, &s->iformat, filename,
                                     s, 0, s->format_probesize);
    else if (s->iformat->flags & AVFMT_NOFILE)
        av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and "
                                  "will be ignored with AVFMT_NOFILE format.\n");
    return 0;
}

if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) ||
    (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score))))
    return score;

if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0)
    return ret;  // **非正常情况从这里return了。**

if (s->iformat)
    return 0;

return av_probe_input_buffer2(s->pb, &s->iformat, filename,
                             s, 0, s->format_probesize);

}

raymond1012 commented 7 years ago

io_open卡住了? 有点奇怪,你看看http open里卡在哪里了,重点看看是不是http_read_header卡住了

2017-05-08 20:24 GMT+08:00 zhanggao notifications@github.com:

static int init_input(AVFormatContext s, const char filename, AVDictionary **options) { int ret; AVProbeData pd = { filename, NULL, 0 }; int score = AVPROBE_SCORE_RETRY;

if (s->pb) { s->flags |= AVFMT_FLAG_CUSTOM_IO; if (!s->iformat) return av_probe_input_buffer2(s->pb, &s->iformat, filename, s, 0, s->format_probesize); else if (s->iformat->flags & AVFMT_NOFILE) av_log(s, AV_LOG_WARNING, "Custom AVIOContext makes no sense and " "will be ignored with AVFMT_NOFILE format.\n"); return 0; }

if ((s->iformat && s->iformat->flags & AVFMT_NOFILE) || (!s->iformat && (s->iformat = av_probe_input_format2(&pd, 0, &score)))) return score;

if ((ret = s->io_open(s, &s->pb, filename, AVIO_FLAG_READ | s->avio_flags, options)) < 0) return ret; // 从这里return了。

if (s->iformat) return 0; return av_probe_input_buffer2(s->pb, &s->iformat, filename, s, 0, s->format_probesize);

}

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/Bilibili/ijkplayer/issues/3048#issuecomment-299852470, or mute the thread https://github.com/notifications/unsubscribe-auth/AEOmlpc2GWOw9CMzlEEn4TP3llwg41Lqks5r3wl6gaJpZM4NR2kf .

zhanggao commented 7 years ago

s->io_open 这句走到了 options.c的io_open_default函数里面,卡在了 return ffio_open_whitelist();这句。

执行 ffio_open_whitelist 这个函数的过程中走进了 http_read_header ,但http_read_header 这个函数没有卡住,瞬间执行完了。

raymond1012 commented 7 years ago

http_open_cnx 有没有返回

2017-05-09 11:42 GMT+08:00 zhanggao notifications@github.com:

s->io_open 这句走到了 options.c的io_open_default函数里面,卡在了 return ffio_open_whitelist();这句。

执行 ffio_open_whitelist 这个函数的过程中走进了 http_read_header ,但http_read_header 这个函数没有卡住,瞬间执行完了。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/Bilibili/ijkplayer/issues/3048#issuecomment-300053170, or mute the thread https://github.com/notifications/unsubscribe-auth/AEOmloXt4qQW4mhT9gCj2T9OHJwJFd2yks5r3-CPgaJpZM4NR2kf .

zhanggao commented 7 years ago

是卡在 http_open_cnx 里了。

static int http_open_cnx(URLContext *h, AVDictionary *options) { HTTPAuthType cur_auth_type, cur_proxy_auth_type; HTTPContext s = h->priv_data; int location_changed, attempts = 0, redirects = 0; redo: av_dict_copy(options, s->chained_options, 0);

cur_auth_type       = s->auth_state.auth_type;
cur_proxy_auth_type = s->auth_state.auth_type;
// 貌似是这句代码比较耗时
location_changed = http_open_cnx_internal(h, options);
if (location_changed < 0)
    goto fail; // 非正常情况走进了这里。

当 http_open_cnx 函数没执行完就调用了release,就会导致release卡顿比较长的时间。

AlanJaver commented 7 years ago

确实遇到过_release和_reset两个方法造成的ANR,貌似是释放连接比较慢。这个如果java层开个线程去做,不知道会不会有其他隐患?

Tipsyume commented 7 years ago

@AlanJaver 我现在就是使用线程做释放 ,出现很多问题

Tipsyume commented 7 years ago

@zhanggao 你的问题解决了没,我现在也遇到这个问题,使用线程池做释放,还没彻底解决这个问题

JoeSteven commented 7 years ago

@Tipsyume 同为 现在也遇到这个问题,放倒异步线程里面释放,用户反馈还是会anr

zhanggao commented 7 years ago

@Tipsyume @JoeSteven 我这边把ip解析改了就没这问题了,设置成只解析ipv4。 你们可以搜下关于ipv6解析卡的问题。

yueyetv commented 6 years ago

@zhanggao 在我们公司的网络下解析非常慢,是否也有可能是IPV6造成的,具体怎么检查

zhanggao commented 6 years ago

禁止ipv6的解析,或者放自线程释放都能解决。

1、 https://github.com/Bilibili/FFmpeg/blob/master/libavformat/tcp.c#L106 hints.ai_family = AF_UNSPEC;表示先解析ipv6,超时再解析ipv4 hints.ai_family = AF_INET;表示只解析ipv4 2、 子线程释放player的时候需要注意多线程的引用别乱掉了,java层实现。 只需要把player的reset release放到子线程执行。 https://github.com/Bilibili/ijkplayer/blob/master/android/ijkplayer/ijkplayer-example/src/main/java/tv/danmaku/ijk/media/example/widget/media/IjkVideoView.java#L723 修改L723到L724

final IMediaPlayer tempPlayer = mMediaPlayer;
// mMediaPlayer.pause(); // 如果下面的释放放线程池里执行,可能执行时间比较靠后,也可以先尝试暂停。
mMediaPlayer = null;
new Thread(new Runnable() {
    tempPlayer.reset();
    tempPlayer.release();
}).start();
linjiansheng commented 6 years ago

@zhanggao hints.ai_family = AF_UNSPEC;表示先解析ipv6,超时再解析ipv4 上面你的注释不准确吧(><) addrinfo_one_by_one 和 addrinfo_timeout 配合使用,不需要去手动改代码,就可以达到先解析ipv4在解析ipv6的类似效果 - -

lgengsy commented 5 years ago

@zhanggao 你放到子线程中处理,在player释放的过程中如果重新打开一个视频会不会出问题。现在新打开的这个player会被停掉吧 。

zhanggao commented 5 years ago

@zhanggao 你放到子线程中处理,在player释放的过程中如果重新打开一个视频会不会出问题。现在新打开的这个player会被停掉吧 。

不会,打开新的视频,new出了新的player实例;tempPlayer引用的是老的实例,子线程里是释放老的实例。

oncealong commented 5 years ago

@zhanggao 你放到子线程中处理,在player释放的过程中如果重新打开一个视频会不会出问题。现在新打开的这个player会被停掉吧 。

不会,打开新的视频,new出了新的player实例;tempPlayer引用的是老的实例,子线程里是释放老的实例。

你好, 请问有遇到其他anr问题么? 现在 我还遇到了播放视频退出时anr, getDuration anr, _stop anr, _setVideoSurface anr。

zhanggao commented 5 years ago

@oncealong 大面积使用没有遇到其它anr。只遇到释放anr,只有在没加载卡顿的,没加载出来的时候调用释放才会anr。

DysaniazzZ commented 5 years ago

@zhanggao 1、禁止 IPV6 的解析也并不能杜绝 ANR 的发生。我们线上发现有些视频源会频繁发生 ANR,如论使用系统播放器还是 ijk,都会发生。eg: http://lssplay.tcgqxx.com/qxdq/5a6049403b86c.m3u8?auth_key=1831619648-e8ffb6a1e5cb544f03bf3aba746638da 2、子线程释放播放器的操作会有副作用。测试发现,当释放一个播放器的同时播放下一个源,开始播放时可能会出现画面卡在上一个视频源,而音频播放的当前视频源。

ChinaZeng commented 4 years ago

@DysaniazzZ 这个问题有解吗,老哥

zhanggao commented 4 years ago

@ChinaZeng 我这边放子线程释放是没什么问题的,用很久了。

Limy1992 commented 3 years ago

@zhanggao 在网速超级慢的情况下,放子线程里释放不会anr,但是有概率报错SIGABRT的错误,释放完差不多等了2分钟。https://github.com/Bilibili/FFmpeg/blob/master/libavformat/tcp.c#L106 hints.ai_family = AF_UNSPEC;表示先解析ipv6,超时再解析ipv4 hints.ai_family = AF_INET;表示只解析ipv4 修改完之后重新编译so文件,没有起到效果,释放的时候还是存在耗时。