MediaRecorder记录和传输视频

时间:2018-12-24 13:55:38

标签: media-player wifi-direct

我正在尝试编写一个在一个设备上录制视频并将其通过WiFi-Direct发送到另一台设备的应用。

现在,我已经无法使用MediaRecorder录制视频了。 我在以下代码示例之后构建我的应用程序 https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java 将文件设置为MediaRecorder的输出文件时,mediaRecorder.prepare()和mediarecorder.start()可以工作,但是当我调用mediaRecorder.stop()方法时,我的应用程序崩溃了。我在控制台中收到类似“ mediaRecorder stop()failed -1007 failed”之类的错误。 我检查了这个问题的建议解决方案 Android mediarecorder stop failed 但这并不能解决我的问题。 我还尝试了一些发现的示例代码,以直接使用ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(skt)mMediaRecorder.setOutputFile(pfd.getFileDescriptor());来不必保护视频,并在另一台设备上与MediaPlayer一起播放,但是mediaRecorder.prepare()已经给出了一个例子

thx已经为我将获得的任何可能的帮助

*编辑

保存视频后,下一个问题出现:传输视频。 设备通过Wifidirect连接,并且有一个共享套接字。 我想向视频发送此消息:

public void sendFile(String filepath) {
        int len;
        byte buf[] = new byte[1024];
        try {
            OutputStream out = socket.getOutputStream();
            File file = new File(filepath);
            FileInputStream is = new FileInputStream(file);
            while ((len = is.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
            out.close();
            is.close();


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
}

在发送端没有任何异常,但是我如何查看是否真的发送了整个文件的数据? 在接收方,我尝试了以下操作:`公共类SendReceive扩展了线程{

    private InputStream inputStream;
    private OutputStream outputStream;

    public SendReceive(Socket skt) {
        socket = skt;
        try {
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void run() {
        byte[] bytes = new byte[16 * 1024];
        String path = null;
        try {
            while (inputStream.read(bytes) != -1) {
                String filename = (getFilesDir() + "/")
                        + System.currentTimeMillis() + ".mp4";
                int count;
                byte[] buffer = new byte[8192]; // or 4096, or more
                OutputStream out = null;
                BufferedOutputStream    bos= null;
                try {
                    File video = new File(filename);
                    File dirs = new File(video.getParent());
                    if (!dirs.exists())
                        dirs.mkdirs();
                    video.createNewFile();

                    path = video.getAbsolutePath();
                    out = new FileOutputStream(video);
                    bos = new BufferedOutputStream(out);
                } catch (FileNotFoundException ex) {
                    System.out.println("File not found. ");
                }


                copyFile(inputStream,bos);
                out.flush();
                out.close();
                //      showVideo(filename);
                byte[] namearray = path.getBytes();
                handler.obtainMessage(MESSAGE_READ, counter, -1, namearray).sendToTarget();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

。 。

public static boolean copyFile(InputStream inputStream, OutputStream out) {
        byte buf[] = new byte[1024];
        int len;
        try {
            while ((len = inputStream.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
            out.flush();

            inputStream.close();
        } catch (IOException e) {

            return false;
        }
        return true;
    }

当这样做时,在路径的位置没有创建文件,但是我确实从输入流中接收字节。我只想保护从另一台设备上的另一台设备发送并在MediaPlayer播放后播放的视频

问候

1 个答案:

答案 0 :(得分:0)

我想我通过录制视频找到了解决我的问题的方法。此项帮助我: capturing a video using camera2 and MediaRecorder

似乎在大多数样本中我发现缺少一件简单的事情:

private CaptureRequest.Builder mPreviewBuilder;

...添加我要捕获的紧急情况,设置mediaRecorder,准备MediaRecorder等...

CaptureRequest request;
request= mPreviewBuilder.build();
 cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {

                   @Override
                   public void onConfigured(@NonNull CameraCaptureSession ccs) {
                       cameraCaptureSession = ccs;
                     updatePreview();
                       getActivity().runOnUiThread(new Runnable() {
                           @Override
                           public void run() {
                               // UI
                               start.setText("stop");
                               isrecording = true;

                               try {
                                   cameraCaptureSession.setRepeatingRequest(request,
                                           new CameraCaptureSession.CaptureCallback() {
                                               @Override
                                               public void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) {
                                                   super.onCaptureStarted(session, request, timestamp, frameNumber);
                                               }

                                               @Override
                                               public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                                                   super.onCaptureCompleted(session, request, result);
                                               }
                                           }, null);
                               } catch (CameraAccessException e) {
                                   e.printStackTrace();
                               }

                           }
                       });
                       mMediaRecorder.start();
                   }

也许这可以帮助任何遇到类似问题的人