Android 6.0以上版本使用 Localsocket 与 ParcelFileDescriptor 获取视频流导致MediaRecorder start failed的问题

因为这段时间一直在搞Android音视频相关的问题,遇到一个需求就是需要获取实时的录像数据,所以就需要获取MediaRecorder的流数据,因为之前一直未做过相关需求,所以最后Google了一番,发现可以使用Localsocket和ParcelFileDescriptor 来获取,但是设置之后发现MediaRecorder根本没法start,无奈继续Google,最后也算发现了缘由,作为一些经验与大家分享一下:

1、使用Localsocket start failed 的原因:

https://issuetracker.google.com/issues/37012466

在Android 5.1(>= API 21)之后,因为SELinux 的策略机制,不允许mediaserver处理生成的抽象unix域套接字。 所以导致Localsocket在Android 5.1之后就无法用来获取Mediarecorder的流数据;当然,在Android5.1上可以使用ParcelFileDescriptor 来继续获取MediaRecorder。

2、ParcelFileDescriptor start fail的原因:

https://stackoverflow.com/questions/41666114/android-mediarecorder-and-filedescriptor

在Android 6.0(API 22)之后的版本因为这个Commit的原因,导致无法使用MPEG_4 作为video的输出格式来输出视频,如果你还是设置为MPEG_4 ,那么在Mediarecorder start的时候会直接出错,所以办法就是:1、如果你可以修改源码,则注释这部分代码;2、如果没法修改源码,则可以选择VP8等视频格式作为输出格式,来获取视频流,当然如果你的设备使用android 8.0 (API 26)的话,可以使用新添加的MPEG_2_TS 来获取H.264/AAC的流数据,之后保存为MP4即可。

猜你喜欢

转载自blog.csdn.net/oLengYueZa/article/details/84255324