java - "Seekable"与 MediaRecorder Android 6.0 (API 23) 一起使用的文件描述符

标签 java android mediarecorder parcelfiledescriptor

所以我正在尝试将我的 Android 用作网络摄像头。我的代码非常适合 API <= 22。我正在使用 ParcelFileDescriptorcreatePipe()创建用于读取和写入的管道的方法。

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

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() 一起使用时似乎不可寻找。

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

最佳答案

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

mMediaRecorder.setOutputFormat(8);

从文档

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

公共(public)静态最终 int OUTPUT_FORMAT_MPEG2TS = 8;**

然而,它仍然不适用于棉花糖或牛轧糖。我让它为kit kat工作。让我知道这是否有帮助。

关于java - "Seekable"与 MediaRecorder Android 6.0 (API 23) 一起使用的文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39994345/

相关文章:

java - 没有 JAAS 的 Kerberos 身份验证?

java - 如何设置 AlarmManager 的特定日期、小时、分钟和秒

android - 在 Mac 上安装 Kindle Fire

java - 第二次无法打开相机

android - 在Android应用程序中录制来自外部源的音频

java - Android媒体录制错误启动失败-19 runTimeException

Android getSupportedVideoSizes 总是返回 null

c# - 在asp.net和java之间共享 session 变量

java - 将框架与多个 Java 类绑定(bind)或连接

android - 我们可以使用全局 gradle-wrapper.properties 文件吗