记使用MediaExtractor解析视频在setDataSource()时出现的IlleageStateException问题

最近在学习音视频开发相关的东西,学习路线取自知乎上一个很火的帖子Android 音视频开发入门指南。
在使用MediaExtractor解析视频文件时遇到了一个问题,网上寻找一下午也没找到有效的解决方法。MediaExtractor的用法网上有很多文章,这里就不介绍了,这个类可以用来解析视频数据,按信道可以将视频分离成无声的视频和音频数据,在这之前需要调用setDataSource(String path)设置数据源,传入的path参数可以是本地文件路径,也可以是链接。
先看一下相关代码和错误日志:

相关代码

错误日志

诡异的地方就在这里,错误日志显示错误发生在102行,那里是获取MINE格式,进而获取视频和音频信道索引,为后面分离视频和音频做准备。我在查找时从设置数据源即96行还是断点,结果发现这一行就进入抛异常了,结果一下午就纠结在MediaExtractor调用setDataSource报IlleageStateException异常这个问题上,网上有迹可循说出现这个问题有两种可能,一是:设置的文件路径有问题,要使用绝对路径;二是:没有相关的内存读取权限(包括动态申请权限)或者网络权限。针对上面两点我都试过,要是路径有问题,会直接提示找不到文件,尝试之后依然没有解决问题。
后来。我发现错误日志等级是W,是警告级别,并不是E级别,而且打断点抛异常的行数和日志给的行数也不一致,后来我就一行行打断点,发现在for循环内,循环到第三次的时候报错了,猛然醒悟是 信道数(trackCount) 的问题,打印出来发现获取到的信道数是2,而我截图中那样的循环写法,会在i=2的时候也进入循环,此时102行获取信道格式时抛了异常,后来想了想,一共只获得了2个信道,循环了三次,明显是数组越界了,后面改成下面这个写法问题就解决了:
image.png

你可能感兴趣的:(记使用MediaExtractor解析视频在setDataSource()时出现的IlleageStateException问题)