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

本文探讨了在不同Android版本中使用Localsocket和ParcelFileDescriptor获取MediaRecorder流数据的限制及解决方案,包括SELinux策略的影响及视频输出格式的选择。

转:https://blog.youkuaiyun.com/olengyueza/article/details/84255324

因为这段时间一直在搞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即可。
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值