MediaRecorder запись и передача видео - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь написать приложение, которое записывает видео на одно устройство и отправляет его на другое устройство через 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 () fail -1007» в консоли.Я проверил предложенные решения из этого вопроса Не удалось завершить останов Android mediarecorder , но это не помогло решить мою проблему.Я также попробовал некоторый пример кода, который я нашел, чтобы напрямую использовать ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(skt) и mMediaRecorder.setOutputFile(pfd.getFileDescriptor());, чтобы не было необходимости сохранять видео и воспроизводить его с MediaPlayer на другом устройстве, но затем mediaRecorder.prepare () уже дает исключение

спасибо за любую возможную помощь, которую я получу

* edit

после сохранения видео, возникла следующая проблема: перенести его.Устройства подключены через 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 extends Thread {

    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

greetings

1 Ответ

0 голосов
/ 25 декабря 2018

Я думаю, что нашел решение моей проблемы с записью видео.Эта запись помогла мне: захват видео с помощью camera2 и MediaRecorder

Кажется, что в большинстве примеров я обнаружил, что не хватает одной простой вещи:

private CaptureRequest.Builder mPreviewBuilder;

... добавлениевыживания, с которыми я хочу сделать захват, настроить mediaRecorder, подготовить MediaRecorder и т. д.

...