Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MediaRecorder和文件描述符_Android_Streaming_File Descriptor_Mediarecorder - Fatal编程技术网

Android MediaRecorder和文件描述符

Android MediaRecorder和文件描述符,android,streaming,file-descriptor,mediarecorder,Android,Streaming,File Descriptor,Mediarecorder,我正在开发一个应用程序,允许用户将安卓手机的屏幕直接投射到另一部手机上。它基于libstreaming库,经过一些修改 我已经安装了MediaRecorder,但输出不是发送到文件,而是发送到文件描述符。我有两个使用ParcelFileDescriptor.createPipe()创建的文件描述符 然后在第二个文件描述符中读取输出。流经过处理,因此可以跳过mp4文件中尚不存在的标题,但可以对视频流进行处理 InputStream is = new ParcelFileDescriptor.Aut

我正在开发一个应用程序,允许用户将安卓手机的屏幕直接投射到另一部手机上。它基于libstreaming库,经过一些修改

我已经安装了MediaRecorder,但输出不是发送到文件,而是发送到文件描述符。我有两个使用ParcelFileDescriptor.createPipe()创建的文件描述符

然后在第二个文件描述符中读取输出。流经过处理,因此可以跳过mp4文件中尚不存在的标题,但可以对视频流进行处理

InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(mParcelRead);
try {
  byte buffer[] = new byte[4];
  // Skip all atoms preceding mdat atom
  while (!Thread.interrupted()) {
    while (is.read() != 'm') ;
    is.read(buffer, 0, 3);
    if (buffer[0] == 'd' && buffer[1] == 'a' && buffer[2] == 't') break;
  }
} catch (IOException e) {
  Log.e(TAG, "Couldn't skip mp4 header :/");
  stop();
  throw e;
}
(After this point the stream is sent over the network)

问题是,显然在API 23之后,android不允许使用不可查找的文件描述符。 你知道我该如何克服这个问题吗


谢谢。

“android不允许不可查找的文件描述符”--你说的“android”是什么意思?你的意思是说,
MediaRecorder
不允许使用不可查找的文件描述符吗?这是另一篇文章的回复:由于Android API level=23,在编码MPEG4视频时不再可能使用不可查找的文件描述符(也可以使用ParcelFileDescriptor)。从中可以看出,此MPEG4Writer已被修改为打印错误,并在检测到不可查找的文件描述符时退出。可能选择不同于MP4的视频编解码器,以避免
MPEG4Writer
。我需要它是MP4,因为整个库都依赖于该格式。它解析文件并生成一些配置。对不起,我没有任何进一步的建议给你。你现有的方法已经有风险了
MediaRecorder
一直希望为MP4提供可查找的流;现在谷歌正在强制执行它。“android不允许不可查找的文件描述符”——你说的“android”是什么意思?你的意思是说,
MediaRecorder
不允许使用不可查找的文件描述符吗?这是另一篇文章的回复:由于Android API level=23,在编码MPEG4视频时不再可能使用不可查找的文件描述符(也可以使用ParcelFileDescriptor)。从中可以看出,此MPEG4Writer已被修改为打印错误,并在检测到不可查找的文件描述符时退出。可能选择不同于MP4的视频编解码器,以避免
MPEG4Writer
。我需要它是MP4,因为整个库都依赖于该格式。它解析文件并生成一些配置。对不起,我没有任何进一步的建议给你。你现有的方法已经有风险了
MediaRecorder
一直希望为MP4提供可查找的流;现在谷歌只是在强制执行。
InputStream is = new ParcelFileDescriptor.AutoCloseInputStream(mParcelRead);
try {
  byte buffer[] = new byte[4];
  // Skip all atoms preceding mdat atom
  while (!Thread.interrupted()) {
    while (is.read() != 'm') ;
    is.read(buffer, 0, 3);
    if (buffer[0] == 'd' && buffer[1] == 'a' && buffer[2] == 't') break;
  }
} catch (IOException e) {
  Log.e(TAG, "Couldn't skip mp4 header :/");
  stop();
  throw e;
}
(After this point the stream is sent over the network)