1. 程式人生 > >Android 6.0以上版本使用 Localsocket 與 ParcelFileDescriptor 獲取視訊流導致MediaRecorder start failed的問題

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即可。