Closed walkermi closed 9 years ago
blind fixed: 21f860b3fd0894e794fed56f1f2daa5e818a499f
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 仍然是
[IJKFFMoviePlayerController setLogReport:YES];
[IJKFFMoviePlayerController setLogLevel:IJK_AV_LOG_DEBUG];
[IJKFFMoviePlayerController setLogReport:NO];
[IJKFFMoviePlayerController setLogLevel:IJK_AV_LOG_INFO];
昨天fix后的代码,crash的几率降低但仍然有,同样崩溃在 static void GetPktTSFromRef(CFDictionaryRef inFrameInfoDictionary, sort_queue *frame) 截图如下 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
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
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)
try ad4f76217402b4d9dd95101852c56f787ee4ce05
暂未复现该问题,close!
iOSdemo在线播放实时rtmp直播,经常性崩溃。demo修改了如下
1、IJKDemoInputURLViewController.m 增加rtmp
(void)onClickPlayButton { NSURL url = [NSURL URLWithString:self.textView.text]; NSString scheme = [[url scheme] lowercaseString];
if ([scheme isEqualToString:@"rtmp"] || [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]) { [IJKVideoViewController presentFromViewController:self withTitle:[NSString stringWithFormat:@"URL: %@", url] URL:url completion:^{ // [self.navigationController popViewControllerAnimated:NO]; }]; } }
2、IJKFFOptions.m,默认打开硬解
(IJKFFOptions )optionsByDefault { IJKFFOptions options = [[IJKFFOptions alloc] init];
options.skipLoopFilter = IJK_AVDISCARD_ALL; options.skipFrame = IJK_AVDISCARD_NONREF;
options.frameBufferCount = 3; options.maxFps = 30; options.frameDrop = 0; options.pauseInBackground = YES;
options.timeout = 30 * 1000 * 1000; // 30 seconds options.userAgent = @""; options.videoToolboxEnabled = YES; options.frameMaxWidth = 960; options.autoReconnect = YES;
return options; }
播放后,经常性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;
}
有一次在这里 int videotoolbox_decode_video_internal(VideoToolBoxContext* context, AVCodecContext avctx, const AVPacket *avpkt, int got_picture_ptr) { ........ CFRelease(frame_info);
}
日志如下 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)