iOS AVFoundation Process mediaserverd crash 分析处理

一.问题描述

1.现象

a.多段视频组合,有转场变速等操作,预览(黑屏)或导出失败.
b.AVPlayerItem收到AVPlayerItemStatusFailed的KVO
c.app收到AVAudioSessionMediaServicesWereResetNotification通知
d.不同设备表现也不相同有的预览失败有的导出失败
e.iOS8的touch复现率极高

2.视频合并预览或导出过程失败 日志

Incident Identifier: 3423F244-30C8-4BF6-8B17-973A484A56D9
CrashReporter Key:   df68ba962d120b617cde7167c3ce094db3dcaa19
Hardware Model:      iPhone10,1
Process:             mediaserverd [26]
Path:                /usr/sbin/mediaserverd
Identifier:          mediaserverd
Version:             ???
Code Type:           ARM-64 (Native)
Role:                Unspecified
Parent Process:      launchd [1]
Coalition:           com.apple.mediaserverd [15]


Date/Time:           2019-06-10 18:23:34.8714 +0800
Launch Time:         2019-06-03 09:52:03.1229 +0800
OS Version:          iPhone OS 12.3.1 (16F203)
Baseband Version:    3.60.01
Report Version:      104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x000000011d6d4000
VM Region Info: 0x11d6d4000 is not in any region.  Bytes after previous region: 1474561  Bytes before following region: 25378816
      REGION TYPE                      START - END             [ VSIZE] PRT/MAX SHRMOD  REGION DETAIL
      MALLOC_LARGE           000000011d544000-000000011d56c000 [  160K] rw-/rwx SM=PRV  
--->  GAP OF 0x199c000 BYTES
      MALLOC_LARGE           000000011ef08000-000000011f008000 [ 1024K] rw-/rwx SM=PRV  

Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [26]
Triggered by Thread:  15
.
.
.
.

Thread 15 name:  Dispatch queue: com.apple.coremedia.basicvideocompositor.layerprocessing
Thread 15 Crashed:
0   MediaToolbox                    0x0000000201e2e3c8 bvc_SimpleMixingOpaque_420v_420v_420v_arm + 312
1   MediaToolbox                    0x0000000201cfe9fc __bvc_mixBuffers_block_invoke + 732
2   libdispatch.dylib               0x00000001fcc95814 _dispatch_client_callout2 + 16
3   libdispatch.dylib               0x00000001fcc7aeb4 _dispatch_apply_serial + 116
4   libdispatch.dylib               0x00000001fcc957d4 _dispatch_client_callout + 16
5   libdispatch.dylib               0x00000001fcc76bf4 _dispatch_sync_invoke_and_complete + 56
6   libdispatch.dylib               0x00000001fcc7ad98 dispatch_apply_f$VARIANT$armv81 + 852
7   MediaToolbox                    0x0000000201cfcd58 bvc_mixBuffers + 1296
8   MediaToolbox                    0x0000000201cfc318 __basicVideoCompositor_RenderFrame_block_invoke_4 + 2300
9   libdispatch.dylib               0x00000001fcc94a38 _dispatch_call_block_and_release + 24
10  libdispatch.dylib               0x00000001fcc957d4 _dispatch_client_callout + 16
11  libdispatch.dylib               0x00000001fcc70dec _dispatch_lane_serial_drain$VARIANT$armv81 + 548
12  libdispatch.dylib               0x00000001fcc7192c _dispatch_lane_invoke$VARIANT$armv81 + 408
13  libdispatch.dylib               0x00000001fcc79e08 _dispatch_workloop_worker_thread + 584
14  libsystem_pthread.dylib         0x00000001fce75114 _pthread_wqthread + 304
15  libsystem_pthread.dylib         0x00000001fce77cd4 start_wqthread + 4

3.复现过程

必现步骤1

a.多段视频编辑,选择4端视频 ABCD顺序
b.A 变速为极快 B变速为快 C变速为极快 D变速为极快
c.全部选择上下转场方式
以上任意条件不满足,都不能复现,iPhoneXR导出失败 iPhone8预览失败 
其他出现的情况,没有必现的步骤

必现步骤2

a.多段视频编辑,选择4端视频 ABCD顺序
b.A 变速为极快 其他不变速,全部选择上下转场方式
c.预览一遍整体视频,之后导出视频

进一步缩小条件范围

a.多段视频编辑,选择2段视频 AB
b.A(宽) 变速为极快后2s 其他不变速,全部选择上下转场方式
c.导出视频失败 iPhoneXR iPhone8都是预览没问题,导出失败
a.两段 A(宽)视频4s的视频 变为快速后为2S
b.上下转场方式
c.导出失败

二.问题定位过程 (已知必现必现步骤的情况)

1.发现transform中的a与d出现 -1.2246467991473537e-16值,怀疑是tranform错误引起的

a.用这些值配置Transform,处理独立的layer,没有MediaToolbox crash问题,只是内容无法正常展示

2.transform过程导出失败

a.只把上下转场工程的视频片段导出到本地,未发生异常MediaToolbox crash?

3.单个视频正常播放过程导出

a.只把变速后的视频片段导出,未发生异常MediaToolbox crash?

三.确认是AVFoundation

1.1apple论坛上提问 https://forums.developer.apple.com/thread/118467?start=0&tstart=0

2.提交bug https://feedbackassistant.apple.com/feedback/6201450

3.苹果技术人员没有明确的避免这个crash的方法

四.自己查找避免办法

1.通过不断的注释掉相关代码尝试最终确认为 toStartLayerTransform引起的

2.垂直转场中 startToLayerTranshform 与 startFromLayerTransfrom特殊值引起

3.在垂直转场过程中加上avoidMediaCrashOffset之后未复现过

4.强制上下转场过程不是从视频最底部开始,而是有一定的偏移量,人眼无感知.但代码很奇怪...

+ (CGAffineTransform)getTransformWithDegree:(NSUInteger)rotationAngle
                              origTransform:(CGAffineTransform)origTransform
                                  transType:(AHSVVideoTransformType)transType
                            targetVideoSize:(CGSize)targetVideoSize
                                     isFrom:(BOOL)isFromOrTo {
    CGFloat videoWidth = targetVideoSize.width;
    CGFloat videoHeight = targetVideoSize.height;
    CGAffineTransform transform = CGAffineTransformIdentity;
    rotationAngle = rotationAngle % 360;
    
    //为避免mediaserverd crash 添加的位移偏移量
    NSUInteger avoidMediaCrashOffset = 5.0;
    if (transType == AHSVVideoTransformTypeHor) {
        if (isFromOrTo) { //from的 动画结束transform
            //注意:由于origTransform包含缩放 要缩放后位移 否则缩放会缩放位移距离
            transform = CGAffineTransformConcat(origTransform, CGAffineTransformMakeTranslation(-videoWidth + avoidMediaCrashOffset, 0));
        } else { //to的 开始动画transform
            transform = CGAffineTransformConcat(origTransform, CGAffineTransformMakeTranslation(videoWidth - avoidMediaCrashOffset, 0));
        }
        
    } else if (transType == AHSVVideoTransformTypeVer) {
        if (isFromOrTo) { //from的 动画结束transform
            //注意:由于origTransform包含缩放 要缩放后位移 否则缩放会缩放位移距离
            transform = CGAffineTransformConcat(origTransform, CGAffineTransformMakeTranslation(0, -videoHeight + avoidMediaCrashOffset));
        } else { //to的 开始动画transform
            transform = CGAffineTransformConcat(origTransform, CGAffineTransformMakeTranslation(0, videoHeight - avoidMediaCrashOffset));
        }
    }
    
    return transform;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容