用于 MediaRecorder Android 6.0 (API 23) 的“Seekable”文件描述符

Posted

技术标签:

【中文标题】用于 MediaRecorder Android 6.0 (API 23) 的“Seekable”文件描述符【英文标题】:"Seekable" file descriptor to use with MediaRecorder Android 6.0 (API 23) 【发布时间】:2017-02-21 00:06:07 【问题描述】:

所以我正在尝试将我的 android 用作网络摄像头。我的代码非常适合 API ParcelFileDescriptor 的 createPipe() 方法来创建用于读写的管道。

简而言之,我写给管道的内容如下:

ParcelFileDescriptor[] parcelFileDescriptors = ParcelFileDescriptor.createPipe();

ParcelFileDescriptor mParcelWrite =new ParcelFileDescriptor(mParcelFileDescriptors[1]);

MediaRecorder mMediaRecorder = new MediaRecorder();
mMediaRecorder.setOutputFile(mParcelWrite.getFileDescriptor());
..
..// Other settings.
mMediaRecorder.start();

当我运行它时,我得到以下异常,

E/MediaRecorder: start failed: -2147483648
W/System.err: java.lang.RuntimeException: start failed. W/System.err: at android.media.MediaRecorder.start(Native Method)
W/System.err: at com.ksy.recordlib.service.recoder.RecoderVideoSource.prepare(RecoderVideoSource.java:105)
W/System.err: at com.ksy.recordlib.service.recoder.RecoderVideoSource.run(RecoderVideoSource.java:173) 
W/System.err: at java.lang.Thread.run(Thread.java:818)

我知道,在 API 23 中,他们创建了一个 change,这阻止了 MediaRecorder 处理不可搜索的文件描述符。

ParcelFileDescriptorcreatePipe() 一起使用时似乎不可搜索。

我的问题是,我怎样才能使它可搜索?有什么替代方案吗? 谢谢。

【问题讨论】:

我也有这种问题。我尝试使用 LocalSockets 和 Sockets,但在使用 FileDescriptors 时仍然没有运气。 【参考方案1】:

我已经调查了一周。您可以设置的输出格式中有一个隐藏格式,即

mMediaRecorder.setOutputFormat(8);

来自文档

**@hide H.264/AAC data encapsulated in MPEG2/TS 

public static final int OUTPUT_FORMAT_MPEG2TS = 8;**

但它仍然不适用于 Marshmallow 或 Nougat。我使它适用于kit kat。让我知道这是否有帮助。

【讨论】:

以上是关于用于 MediaRecorder Android 6.0 (API 23) 的“Seekable”文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

android MediaRecorder录制音频

Android MediaRecorder解析

Android 10 源码MediaRecorder 录像流程:MediaRecorder 配置

Android-MediaRecorder-音频录制-警告-W/MediaRecorder(13811): mediarecorder went away with unhandled events(

Android-MediaRecorder录像机(视频)

Android 音频相关