如何通过蓝牙传输套接字文件描述符的内容?

时间:2015-10-24 18:34:31

标签: android sockets bluetooth

关于如何在另一个Android手机上实际查看流,我有几个基本问​​题。录音电话使用以下功能记录到BluetoothSocket文件描述符:

private void Record() {
        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
        mMediaRecorder.setVideoEncodingBitRate(512 * 1000);
        mMediaRecorder.setVideoFrameRate(30);
        mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);
        if (mBluetoothSocket != null) {
            try {
                Field reflectedPfdField = mBluetoothSocket.getClass().getDeclaredField("mPfd");
                reflectedPfdField.setAccessible(true);
                ParcelFileDescriptor mParcelSCStream = (ParcelFileDescriptor) reflectedPfdField.get(mBluetoothSocket);
                if (mParcelSCStream != null) {
                    mMediaRecorder.setOutputFile(mParcelSCStream.getFileDescriptor());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

由于套接字文件描述符不可查找,我们不能相对这样做:

MediaPlayer mp = new MediaPlayer();
mp.setDataSource(bluetoothFileDescriptor);

我已经阅读了这个mattakis blog我们需要修复使用套接字文件描述符发送的文件描述符流。他提到我需要管理mdat原子以及文件类型标题。 我需要更改哪些代码来修复这些内容。

如何通过套接字处理蓝牙流,缓冲蓝牙输入流中的内容,修复标头和mdat原子(我真的不知道这些是什么是),然后......

然后......我怎样才能将修改后的原始流传递给媒体播放器?

这可能吗?

1 个答案:

答案 0 :(得分:1)

将流传递给MediaPlayer的唯一方法是创建自己的HTTP服务器(NanoHTTPD为例),在Android设备的本地主机(127.0.0.1)上支持range request并传输您的流通过uri http://127.0.0.1:55555/...到MediaPlayer。 Android仅支持mp4,3gp和webm视频格式,而moov atom应位于您的流的开头,由MediaPlayer类播放。