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