在使用SGPlayer 播放全景直播流的时候,在电脑端mac通过 VLC播放器或者MKPlayer,都可以正常播放视频源,但是在iOS手机上,视频加载后,有的时候会奔溃,有的时候不崩溃;
在崩溃的时候
- xcode 上的详情显示
Domain: IDEDebugSessionErrorDomain
Code: 10
Failure Reason: Message from debugger: Terminated due to memory issue
大致意思是内存有问题
- SGPlog的log数据 到 vr**流加载完毕 后面很明显么有 videotoolbox_vld 的初始化
2022-03-09 14:35:28.050460+0800 PaiOSnoramicLive[40398:12015087] SGFFLog : Format videotoolbox_vld chosen by get_formaios15t().
2022-03-09 14:35:28.050516+0800 PanoramicLive[40398:12015087] SGFFLog : Format videotoolbox_vld requires hwaccel电脑怎么截图 initialisation.
**2022-03-09 14:32:50.774550+0800 PanoramicLive[40379:12013560] SGFFLog : format: start_time: 1386865.197 duration: -9223372036854.775 bitrate=0 kb/s**
**2022-03-09 14:32:50.778570+0800 PanoramicLive[40379:12013560] SGFFLog : After avformat_find_stream_info() pos: 2399171 bytes read:2399171 seeks:0 frames:120**
**2022-03-09 14:32:50.972442+0800 PanoramicLive[40379:12013407] Metal GPU Frame Capture Enabled**
**2022-03-09 14:32:50.973027+0800 PanoramicLive[40379:12013407] Metal API Validation Enabled**
**2022-03-09 14:32:51.068288+0800 PanoramicLive[40379:12013560] vr**流加载完毕
**2022-03-09 14:32:51.073546+0800 PanoramicLive[40379:12013786] SGFFLog : detected 6 logical cores**
**2022-03-09 14:32:51.073783+0800 PanoramicLive[40379:12013786] SGFFLog : nal_unit_type: 7(SPS), nal_ref_idc: 3**
**2022-03-09 14:32:51.073866+0800 PanoramicLive[40379:12013786] SGFFLog : nal_unit_type: 8(PPS), nal_ref_idc: 3**
**(lldb)**
- bugly 上的崩溃日志是这样的
SGAudioFrame frameWithDescriptor:numberOfSamples:] -[SGAudioDecoder clipFrames:timeRange:]+972
-[SGAudioDecoder processPacket:]+292电脑键盘
-[SGAudioDecoder decode:]+1460
-[SGDecodeContext decode:unlock:]+1796
-[SGDecodeLoop runningThread]+764
大致是SGAudioDecoder在进行解码的时候 从Packet中获取Frame的时候异常;我们可以看到一个很重要的参数numberOfSamples ,采样率,这数据是怎么来的呢?
- xcode 异常奔溃断点截图
再看一下上一步崩溃的地方,可以看出numberO电脑怎么截图fSamples 就是通过这个方法 得到的
**int** nb_samples = (**int**)CMTimeConvertScale(duration, ad.sampleRate, kCMTimeRoundingMethod_RoundTowardZero).value;
CMTimeConvertScale 这个方法是: 使用指定的舍入方法将源时间转换为新的xcode文件中文注释乱码问题时间刻度。
func CMTimeConvertScale(_ time: CMTime , timescale newTimescale: Int32, method: CMTimeRoundingMethod -> CMTime
这个地方电脑怎么录屏转换后,返回的是int,这个地方有没有可能是内存溢出了呢,于是 我用long long int 去接收,然后打印数据,发现,有的时候的 long long int 和 int 返回的数据不同, 于是我查看了int 的范围,
32bit下:
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 和int一样
long 和int一样
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
64bit下
unsigned int 0~4294967295
int -2147483648~2147483647
unsigned long 和 unsigned long long一样
long 和long long一样
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
解决办ios系统法
到这ios鲁多多app里,我们已经可以确定是数据的溢ffmpeg耻辱柱事件出导致崩溃了;我们有两套解ffmpeg是什么软件决方案:
-
- 把后面 所ffmpeg耻辱柱事件有的int换成 long long int ,但是,后面底层的FFmpeffmpeg.dll丢失怎么办g 方法都是int ,目前工程师使用ffmpeg的.o文件 ,所以这个方法行不通
-
- 这里面只是有些数据是异常的,那把这些数据过滤掉也就可以了
所以我这边也是选择这个方法,在 clipFrames方法 CMTimeConvertScale进行转换前,过滤掉异常的数据,应该还有别的更好方法,大家可以补充哦
long long int nb_samplesLong = ( long long int)CMTimeConvertScale(duration, ad.sampleRate, kCMTimeRoundingMethod_RoundTowardZero).value;
if(nb_samplesLong >=2147483647) {
break;
}
完结!