bilibili / ijkplayer

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

iOS今天最新代码,demo播放rtmp经常性crash #296

Closed walkermi closed 9 years ago

walkermi commented 9 years ago

iOSdemo在线播放实时rtmp直播,经常性崩溃。demo修改了如下

1、IJKDemoInputURLViewController.m 增加rtmp

2、IJKFFOptions.m,默认打开硬解

播放后,经常性crash,基本上都在这个地方 static void GetPktTSFromRef(CFDictionaryRef inFrameInfoDictionary, sort_queue *frame) { frame->sort = -1.0; frame->dts = AV_NOPTS_VALUE; frame->pts = AV_NOPTS_VALUE; frame->serial = AV_NOPTS_VALUE; if (inFrameInfoDictionary == NULL) return;

CFNumberRef value[4];

value[0] = (CFNumberRef)CFDictionaryGetValue(inFrameInfoDictionary, CFSTR("PKT_SORT"));
if (value[0])
    CFNumberGetValue(value[0], kCFNumberDoubleType, &frame->sort);
value[1] = (CFNumberRef)CFDictionaryGetValue(inFrameInfoDictionary, CFSTR("PKT_DTS"));
if (value[1])
    CFNumberGetValue(value[1], kCFNumberDoubleType, &frame->dts);
value[2] = (CFNumberRef)CFDictionaryGetValue(inFrameInfoDictionary, CFSTR("PKT_PTS"));
if (value[2])
    CFNumberGetValue(value[2], kCFNumberDoubleType, &frame->pts);
value[3] = (CFNumberRef)CFDictionaryGetValue(inFrameInfoDictionary, CFSTR("PKT_SERIAL"));
if (value[3])
    CFNumberGetValue(value[3], kCFNumberDoubleType, &frame->serial);
return;

}

有一次在这里 int videotoolbox_decode_video_internal(VideoToolBoxContext* context, AVCodecContext avctx, const AVPacket *avpkt, int got_picture_ptr) { ........ CFRelease(frame_info);

if (status != 0) {
    ALOGE("status %d \n", (int)status);
    CFRelease(frame_info);

    if (status == kVTInvalidSessionErr) {
        context->refresh_session = true;
    }
    if (status == kVTVideoDecoderMalfunctionErr) {
        context->recovery_drop_packet = true;
    }
    if (status != 0) {
        goto failed;
    }
}
...........

}

日志如下 ijkmp_set_format_callback(0x1000d413c, 0x1701ca140) ijkmp_set_format_callback()=void ijkmp_set_option_int(start-on-prepared, 1) ijkmp_set_option_int()=void 2015-06-26 17:44:15.347 IJKMediaDemo[344:90011] OK setup GL ijkmp_ios_set_view(glView=0x15563f720) ijkmp_ios_set_view(glView=0x15563f720)=void ijkmp_set_option(overlay-format, fcc-i420) ijkmp_set_option()=void 2015-06-26 17:44:15.355 IJKMediaDemo[344:90011] ======================================== = FFmpeg options: = skip_loop_filter: avdicard all = skipFrame: avdiscard nonref = frameBufferCount: 3 = maxFps: 30

= timeout: 30000000

ijkmp_set_option_int(skip_loop_filter, 48) ijkmp_set_option_int()=void ijkmp_set_option_int(skip_frame, 8) ijkmp_set_option_int()=void ijkmp_set_option_int(max-fps, 30) ijkmp_set_option_int()=void ijkmp_set_option_int(framedrop, 0) ijkmp_set_option_int()=void ijkmp_set_option_int(video-pictq-size, 3) ijkmp_set_option_int()=void ijkmp_ios_set_videotoolbox_enabled enable(EnableFlag=1) ijkmp_ios_set_videotoolbox_enabled enable(EnableFlag=1) ijkmp_ios_set_frame_max_width (width=960) ijkmp_ios_set_frame_max_width after(width=960) ijkmp_set_option_int(reconnect, 1) ijkmp_set_option_int()=void ijkmp_set_option_int(timeout, 30000000) ijkmp_set_option_int()=void ijkmp_set_data_source(url="rtmp://test.xxxxxx.com/live/9985") ijkmp_set_data_source(url="rtmp://test.xxxxxx.com/live/9985")=0 ijkmp_set_option(safe, 0) ijkmp_set_option()=void ijkmp_prepare_async() ===== options ===== player-opts : start-on-prepared = 1 player-opts : overlay-format = fcc-i420 player-opts : max-fps = 30 player-opts : framedrop = 0 player-opts : video-pictq-size = 3 format-opts : reconnect = 1 format-opts : timeout = 30000000 format-opts : safe = 0 codec-opts : skip_loop_filter = 48

codec-opts : skip_frame = 8

ijkmp_prepare_async()=0 ijkmp_start() ijkmp_start()=-3 remove 'timeout' option for rtmp. Handshaking... Type answer 3 Server version 1.0.5.4 Proto = rtmp, path = /live/9985, app = live, fname = 9985 Server bandwidth = 2500000 Client bandwidth = 2500000 Creating stream... Sending play command for '9985' New incoming chunk size = 60000 Format flv probed with size=2048 and score=100 Option reconnect not found. Before avformat_find_stream_info() pos: 13 bytes read:2172 seeks:0 Unknown type |RtmpSampleAccess Unknown type onStatus Stream discovered after head already parsed Increasing reorder buffer to 1 no picture All info found Setting avg frame rate based on r frame rate After avformat_find_stream_info() pos: 54976 bytes read:54976 seeks:0 frames:156 max_frame_duration: 3600.000 Input #0, flv, from 'rtmp://test.xxxxxx.com/live/9985': Metadata: Server : NGINX RTMP (github.com/arut/nginx-rtmp-module) displayWidth : 360 displayHeight : 640 fps : 0 profile : level : server_version : 2.0.175 Duration: 00:00:00.00, start: 0.032000, bitrate: N/A Stream #0:0, 115, 1/1000: Audio: aac (LC), 44100 Hz, stereo, fltp Stream #0:1, 41, 1/1000: Video: h264, 2 reference frames, yuv420p(left), 360x640 (368x640), 0/1, 20 fps, 20 tbr, 1k tbn aout_open_audio() AudioCodec: avcodec, aac aout_pause_audio(0) detected 2 logical cores init_videotoolbox - using avcC atom of size(26), ref_frames(2)after scale width 360 height 640 m_max_ref_frames 2 fps: 20.000000 (normal) fps: 20.000000 (normal) 2015-06-26 17:44:19.178 IJKMediaDemo[344:90011] FFP_MSG_VIDEO_DECODER_OPEN: true ijkmp_get_msg: FFP_MSG_PREPARED 2015-06-26 17:44:19.179 IJKMediaDemo[344:90011] FFP_MSG_PREPARED: ijkmp_get_meta_l ijkmp_get_meta_l()=void flushed last keyframe pts 0 2015-06-26 17:44:19.180 IJKMediaDemo[344:90011] fps in meta 20.000000 2015-06-26 17:44:19.181 IJKMediaDemo[344:90011] mediaIsPreparedToPlayDidChange 2015-06-26 17:44:19.181 IJKMediaDemo[344:90011] loadStateDidChange: MPMovieLoadStatePlaythroughOK: 3 2015-06-26 17:44:19.182 IJKMediaDemo[344:90011] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 2015-06-26 17:44:19.182 IJKMediaDemo[344:90011] FFP_MSG_SAR_CHANGED: 0, 1 2015-06-26 17:44:19.183 IJKMediaDemo[344:90011] moviePlayBackStateDidChange 1: playing after scale width 360 height 640 SDL_VoutVideoToolBox_CreateOverlay(w=360, h=640, fmt=NV12(0x3231564e, dp=0x174055150) 2015-06-26 17:44:19.250 IJKMediaDemo[344:90011] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 2015-06-26 17:44:19.253 IJKMediaDemo[344:90071] OK use NV12 GL renderer 2015-06-26 17:44:19.260 IJKMediaDemo[344:90011] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 2015-06-26 17:44:19.262 IJKMediaDemo[344:90071] OK setup GL programm 2015-06-26 17:44:19.268 IJKMediaDemo[344:90071] OK setup GL framebuffer 1136:640 SDL_VoutVideoToolBox_CreateOverlay(w=360, h=640, fmt=NV12(0x3231564e, dp=0x174055150) SDL_VoutVideoToolBox_CreateOverlay(w=360, h=640, fmt=NV12(0x3231564e, dp=0x174055150) 2015-06-26 17:44:19.297 IJKMediaDemo[344:90011] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 ffp_toggle_buffering_l: start aout_pause_audio(1) 2015-06-26 17:44:27.737 IJKMediaDemo[344:90011] FFP_MSG_BUFFERING_START: 2015-06-26 17:44:27.738 IJKMediaDemo[344:90011] loadStateDidChange: MPMovieLoadStateStalled: 4 Negative cts, previous timestamps might be wrong. Invalid timestamps stream=1, pts=11698, dts=11798, size=121 ffp_toggle_buffering_l: end aout_pause_audio(0) 2015-06-26 17:44:37.347 IJKMediaDemo[344:90011] FFP_MSG_BUFFERING_END: 2015-06-26 17:44:37.347 IJKMediaDemo[344:90011] loadStateDidChange: MPMovieLoadStatePlaythroughOK: 3 2015-06-26 17:44:37.348 IJKMediaDemo[344:90011] moviePlayBackStateDidChange 1: playing status -12911 (lldb)

bbcallen commented 9 years ago

blind fixed: 21f860b3fd0894e794fed56f1f2daa5e818a499f

walkermi commented 9 years ago

typedef enum IJKLogLevel { k_IJK_LOG_UNKNOWN = 0, k_IJK_LOG_DEFAULT = 1,

k_IJK_LOG_VERBOSE = 2,
k_IJK_LOG_DEBUG   = 3,
k_IJK_LOG_INFO    = 4,
k_IJK_LOG_WARN    = 5,
k_IJK_LOG_ERROR   = 6,
k_IJK_LOG_FATAL   = 7,
k_IJK_LOG_SILENT  = 8,

} IJKLogLevel;

但 ijkplayer/ios/IJKMediaDemo/IJKMediaDemo/IJKMoviePlayerViewController.m 仍然是

ifdef DEBUG

[IJKFFMoviePlayerController setLogReport:YES];
[IJKFFMoviePlayerController setLogLevel:IJK_AV_LOG_DEBUG];

else

[IJKFFMoviePlayerController setLogReport:NO];
[IJKFFMoviePlayerController setLogLevel:IJK_AV_LOG_INFO];

endif

bbcallen commented 9 years ago

找不到你贴的这段代码。 https://github.com/Bilibili/ijkplayer/blob/master/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMoviePlayerController.m

walkermi commented 9 years ago

https://github.com/Bilibili/ijkplayer/blob/master/ios/IJKMediaDemo/IJKMediaDemo/IJKMoviePlayerViewController.m

walkermi commented 9 years ago

昨天fix后的代码,crash的几率降低但仍然有,同样崩溃在 static void GetPktTSFromRef(CFDictionaryRef inFrameInfoDictionary, sort_queue *frame) 截图如下 2015-06-27 5 47 49 log如下 ijkmp_dec_ref(): ref=0 ijkmp_shutdown_l() ijkmp_shutdown_l()=void aout_close_audio() ijkmp_set_format_callback(0x1000b4648, 0x1741c9330) ijkmp_set_format_callback()=void ijkmp_set_option_int(start-on-prepared, 1) ijkmp_set_option_int()=void 2015-06-27 17:39:42.772 IJKMediaDemo[323:82879] OK setup GL ijkmp_ios_set_view(glView=0x126d17300) ijkmp_ios_set_view(glView=0x126d17300)=void ijkmp_set_option(overlay-format, fcc-i420) ijkmp_set_option()=void 2015-06-27 17:39:42.773 IJKMediaDemo[323:82879] ======================================== = FFmpeg options: = skip_loop_filter: avdiscard default = skipFrame: avdiscard nonref = frameBufferCount: 3 = maxFps: 30

= timeout: 30000000

ijkmp_set_option_int(skip_loop_filter, 0) ijkmp_set_option_int()=void ijkmp_set_option_int(skip_frame, 8) ijkmp_set_option_int()=void ijkmp_set_option_int(max-fps, 30) ijkmp_set_option_int()=void ijkmp_set_option_int(framedrop, 0) ijkmp_set_option_int()=void ijkmp_set_option_int(video-pictq-size, 3) ijkmp_set_option_int()=void ijkmp_ios_set_videotoolbox_enabled enable(EnableFlag=1) ijkmp_ios_set_videotoolbox_enabled enable(EnableFlag=1) ijkmp_ios_set_frame_max_width (width=960) ijkmp_ios_set_frame_max_width after(width=960) ijkmp_set_option_int(reconnect, 1) ijkmp_set_option_int()=void ijkmp_set_option_int(timeout, 30000000) ijkmp_set_option_int()=void ijkmp_set_data_source(url="rtmp://xxxxxx.test.com/live/10137") ijkmp_set_data_source(url="rtmp://xxxxxx.test.com/live/10137")=0 ijkmp_set_option(safe, 0) ijkmp_set_option()=void ijkmp_prepare_async() ===== options ===== player-opts : start-on-prepared = 1 player-opts : overlay-format = fcc-i420 player-opts : max-fps = 30 player-opts : framedrop = 0 player-opts : video-pictq-size = 3 format-opts : reconnect = 1 format-opts : timeout = 30000000 format-opts : safe = 0 codec-opts : skip_loop_filter = 0

codec-opts : skip_frame = 8

ijkmp_prepare_async()=0 ijkmp_start() ijkmp_start()=-3 [FFPlayer @ 0x126d31ea0] remove 'timeout' option for rtmp. [rtmp @ 0x126d18070] Handshaking... [rtmp @ 0x126d18070] Type answer 3 [rtmp @ 0x126d18070] Server version 1.0.5.4 [rtmp @ 0x126d18070] Proto = rtmp, path = /live/10137, app = live, fname = 10137 [rtmp @ 0x126d18070] Server bandwidth = 2500000 [rtmp @ 0x126d18070] Client bandwidth = 2500000 [rtmp @ 0x126d18070] Creating stream... [rtmp @ 0x126d18070] Sending play command for '10137' [rtmp @ 0x126d18070] New incoming chunk size = 60000 [flv @ 0x127816c00] Format flv probed with size=2048 and score=100 Option reconnect not found. [flv @ 0x127816c00] Before avformat_find_stream_info() pos: 13 bytes read:2074 seeks:0 [flv @ 0x127816c00] Unknown type |RtmpSampleAccess [flv @ 0x127816c00] Unknown type onStatus [flv @ 0x127816c00] Stream discovered after head already parsed [h264 @ 0x1278b4e00] Increasing reorder buffer to 1 [h264 @ 0x1278b4e00] no picture [flv @ 0x127816c00] All info found [flv @ 0x127816c00] Setting avg frame rate based on r frame rate [flv @ 0x127816c00] After avformat_find_stream_info() pos: 166861 bytes read:166861 seeks:0 frames:146 [FFPlayer @ 0x126d31ea0] max_frame_duration: 3600.000 Input #0, flv, from 'rtmp://xxxxxx.test.com/live/10137': Metadata: Server : NGINX RTMP (github.com/arut/nginx-rtmp-module) displayWidth : 360 displayHeight : 640 fps : 0 profile : level : server_version : 2.0.175 Duration: 00:00:00.00, start: 0.031000, bitrate: N/A Stream #0:0, 105, 1/1000: Audio: aac (LC), 44100 Hz, stereo, fltp Stream #0:1, 41, 1/1000: Video: h264, 2 reference frames, yuv420p(left), 360x640 (368x640), 0/1, 20 fps, 20 tbr, 1k tbn aout_open_audio() [FFPlayer @ 0x126d31ea0] AudioCodec: avcodec, aac aout_pause_audio(0) detected 2 logical cores init_videotoolbox - using avcC atom of size(26), ref_frames(2)after scale width 360 height 640 m_max_ref_frames 2 [FFPlayer @ 0x126d31ea0] fps: 20.000000 (normal) [FFPlayer @ 0x126d31ea0] fps: 20.000000 (normal) 2015-06-27 17:39:45.949 IJKMediaDemo[323:82879] FFP_MSG_VIDEO_DECODER_OPEN: true ijkmp_get_msg: FFP_MSG_PREPARED flushed last keyframe pts 0 2015-06-27 17:39:45.950 IJKMediaDemo[323:82879] FFP_MSG_PREPARED: ijkmp_get_meta_l ijkmp_get_meta_l()=void 2015-06-27 17:39:45.951 IJKMediaDemo[323:82879] fps in meta 20.000000 2015-06-27 17:39:45.951 IJKMediaDemo[323:82879] mediaIsPreparedToPlayDidChange 2015-06-27 17:39:45.951 IJKMediaDemo[323:82879] loadStateDidChange: MPMovieLoadStatePlaythroughOK: 3 2015-06-27 17:39:45.952 IJKMediaDemo[323:82879] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 2015-06-27 17:39:45.952 IJKMediaDemo[323:82879] FFP_MSG_SAR_CHANGED: 0, 1 2015-06-27 17:39:45.952 IJKMediaDemo[323:82879] moviePlayBackStateDidChange 1: playing after scale width 360 height 640 SDL_VoutVideoToolBox_CreateOverlay(w=360, h=640, fmt=NV12(0x3231564e, dp=0x1742482b0) 2015-06-27 17:39:45.995 IJKMediaDemo[323:82879] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 2015-06-27 17:39:45.996 IJKMediaDemo[323:83171] OK use NV12 GL renderer 2015-06-27 17:39:46.001 IJKMediaDemo[323:83171] OK setup GL programm 2015-06-27 17:39:46.006 IJKMediaDemo[323:83171] OK setup GL framebuffer 1136:640 2015-06-27 17:39:46.014 IJKMediaDemo[323:82879] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 SDL_VoutVideoToolBox_CreateOverlay(w=360, h=640, fmt=NV12(0x3231564e, dp=0x1742482b0) SDL_VoutVideoToolBox_CreateOverlay(w=360, h=640, fmt=NV12(0x3231564e, dp=0x1742482b0) 2015-06-27 17:39:46.026 IJKMediaDemo[323:82879] FFP_MSG_VIDEO_SIZE_CHANGED: 360, 640 [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [rtmp @ 0x126d18070] Sending bytes read report [FFPlayer @ 0x126d31ea0] ffp_toggle_buffering_l: start aout_pause_audio(1) 2015-06-27 17:44:34.706 IJKMediaDemo[323:82879] FFP_MSG_BUFFERING_START: 2015-06-27 17:44:34.707 IJKMediaDemo[323:82879] loadStateDidChange: MPMovieLoadStateStalled: 4 [rtmp @ 0x126d18070] Sending bytes read report [FFPlayer @ 0x126d31ea0] ffp_toggle_buffering_l: end aout_pause_audio(0) 2015-06-27 17:44:43.942 IJKMediaDemo[323:82879] FFP_MSG_BUFFERING_END: 2015-06-27 17:44:43.943 IJKMediaDemo[323:82879] loadStateDidChange: MPMovieLoadStatePlaythroughOK: 3 2015-06-27 17:44:43.944 IJKMediaDemo[323:82879] moviePlayBackStateDidChange 1: playing status -12911 decode callback -12909 Signal: status status -12911 (lldb)

bbcallen commented 9 years ago

try ad4f76217402b4d9dd95101852c56f787ee4ce05

walkermi commented 9 years ago

暂未复现该问题,close!