最近项目上在 Bugly 上有些崩溃,翻代码的时候怎么也定位不到,经多方排查、查找资料后才确定是由于用 PhotoKit 框架获取视频资源时引起的崩溃。
崩溃原因如下:
1 | -[AVComposition URL]: unrecognized selector sent to instance 0x1c4039180 |
我在项目中的代码类似如下:
1 | - (void)fetchVideoFromAsset:(PHAsset *)asset { |
结合崩溃原因看,可能是因为回调内的强转导致,毕竟 AVAsset
是没有 URL
这个方法的,但经断点调试后发现,回调出来的 avAsset
确实是 AVURLAsset
类型的,也就是说这里并不是强转;
似乎崩溃原因就找不到了,最后查找资料发现,在处理120帧无声音视频的时候,回调的 avAsset
是 AVComposition
而不是 AVURLAsset
。到此,崩溃原因确定。
确定原因之后,解决之道就容易找到了,直接上代码:
1 | - (void)fetchVideoFromAsset:(PHAsset *)asset { |
这种方法是获取到视频的二进制数据,优点是可以传到方法外部然后自定义存储路径。
查看 PHAssetResourceManager
的 API 可以发现,还有另一种直接存储视频到路径的方法,优点是不用像上面那个方法一样需要先拼接二进制文件,缺点是要先确定存储路径,这样在封装的时候不太容易,而且要先删除一下路径下文件,否则如果路径下有文件时,这个方法不能覆盖文件,代码如下:
1 | - (void)fetchVideoFromAsset:(PHAsset *)asset { |