Как записать видео прямо на Helix Server с моего устройства Android?

Я новичок в разработке на стороне сервера. Я хочу работать над приложением, и мне нужно записать видео на Helix Server с моего устройства Android через мое приложение. Я установил сервер Helix на ПК с Windows Server.

В приложении Android я пытаюсь загрузить записанное видео на сервер Helix. Я реализовал свое приложение для записи видео на SD-карту, но я бы хотел записать и сохранить это видео непосредственно на Helix Server. Я реализовал свое приложение для Android следующим образом:

public class NewRecordingVideo extends Activity implements SurfaceHolder.Callback {
    private MediaRecorder recorder;
    boolean flag = false;
    boolean startedRecording = false;
    boolean stoppedRecording = false;
    SurfaceHolder mHolder;
    SurfaceView videoSView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.activity_main);
        recorder = new MediaRecorder();
        recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_RECOGNITION);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        videoSView = ((SurfaceView)findViewById(R.id.surfaceView1));
        mHolder=videoSView.getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        ((Button)findViewById(R.id.startBtn)).setOnClickListener(
            new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                if(startedRecording == false) {
                    recorder.start();
                    startedRecording = true;

                    Toast.makeText(NewRecordingVideo.this,
                        "Your video is recording", Toast.LENGTH_LONG).show();

                 } else if (startedRecording == true && stoppedRecording == false) {
                     recorder.stop();
                     recorder.release();
                     recorder = null;
                     stoppedRecording = true;
                 }
             }
         });

        ((Button)findViewById(R.id.stopBtn)).setOnClickListener(
            new OnClickListener() {

            @Override
            public void onClick(View v) {
                recorder.stop();
                recorder.release();
                recorder = null;
                stoppedRecording = true;

                Toast.makeText(NewRecordingVideo.this,
                    "Your video recorded ", Toast.LENGTH_LONG).show();
                finish();
            }
        }); 
    }

    public Surface getSurface() {
        return mHolder.getSurface();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format,
        int width, int height) {

        // TODO Auto-generated method stub  
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        try {

            Socket socket = new Socket("IP address", 8008);
            ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
            Log.v("find about connection","====>"+socket.isConnected());
            recorder.setOutputFile("/sdcard/recording.3gp");

            // Here I would like to record my video (recording.3gp) on helix server directly    
            recorder.setPreviewDisplay(mHolder.getSurface());
            recorder.prepare();

        } catch (Exception e) {
            String message = e.getMessage();
            recorder.release();
            recorder = null;
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (recorder != null) {
            recorder.release();
            recorder = null;
        }
    }
}

Из приведенного выше кода: Как я могу сохранить файл видеозаписи непосредственно на сервере Helix? Должен ли я делать какие-либо реализации на стороне сервера развития?

2 ответа

Соотношение между размером видео и пропускной способностью сети в данный интервал времени является низким, чтобы одновременно загружать / записывать видеопоток, если только у пользователя нет очень быстрого сотового соединения LTE.

Однако, когда запись будет завершена, вы можете загрузить файл на свой сервер по протоколу FTP. Рекомендуется дать каждому записанному файлу Universal Unique Identifier (UUID) чтобы иметь возможность сделать разницу между всеми другими записанными файлами. Я использовал этот код (не тестируется для Android, но отлично работает на JavaSE 7). Поскольку это довольно долгий (но быстрый) процесс, я сделал вам резюме. (Хорошо, а?)

Резюме

1) Создать UUID с UUID.randomUUID().toString(); это будет использоваться в течение всего процесса для идентификации записанного файла.
2) Запишите файл с именем "sdcard/" + uuid + ".3gp"
3) Когда запись закончится, загрузите файл на свой сервер через FTP.
4) Прикажите вашему удаленному серверу выполнить скрипт PHP, который будет делать с записанным файлом все, что ему нужно, например, манипулирование базой данных и т. Д. (Если такой скрипт есть, если вам это не нужно, просто пропустите это шаг).
5) Закажите удаленный сервер, чтобы удалить файл, если это необходимо. (сделано через другой скрипт PHP)

Код

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;

public class FTPUploader {
    static void doUpload(String uuid) {

      File fileSource = new File("/sdcard/" + uuid + ".3gp");
      // Or new File("/sdcard/recording.3gp");

      String fileName = fileSource.getName();

      /** YOUR SERVER'S INFORMATIONS **/
      String userName = "USERNAME";
      String password = "PASSWORD";
      String ftpServer = "FTP.SERVER.COM";
      /****/

      StringBuffer sb = new StringBuffer("ftp://");

      sb.append(userName);
      sb.append(':');
      sb.append(password);
      sb.append('@');

      sb.append(ftpServer);
      sb.append("/"); 
            /**WARNING: Path extension; it will be added after connection
            *The file must be at your server's root. Otherwise the PHP script won't detect it.
            **/
      sb.append(fileName);

      sb.append(";type=i");


      BufferedInputStream bis = null;
      BufferedOutputStream bos = null;
      try {

            URL url = new URL(sb.toString());
            URLConnection urlc = url.openConnection();
            bos = new BufferedOutputStream(urlc.getOutputStream());
            bis = new BufferedInputStream(new FileInputStream(fileSource));

            int i;

            // read byte by byte until end of stream
            while ((i = bis.read()) != -1) {
                  bos.write(i);
            }
      } catch (Exception e) {
            e.printStackTrace();
      } finally {

            if (bis != null)
                  try {
                        bis.close();
                  } catch (IOException ioe) {
                        ioe.printStackTrace();
                        System.out.println("IO exception after if bis " + ioe);
                  }
            if (bos != null)
                  try {
                        bos.close();
                  } catch (IOException ioe) {
                        ioe.printStackTrace();
                        System.out.println("IO exception after if " + ioe);
                  }
      }
}
}  



import java.util.UUID;

public class Main {


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


        String uuid = UUID.randomUUID().toString();
        //Assuming you set your file's name as uuid + ".3gp"
        FTPUploader.doUpload(uuid);            
        //Launches a FTP Upload


        //Then, if you want to ask your server to "process" the file you gave him, you can perform a simple HTTP request:

        try {
    String url = "http://YOURSITE.COM/shell.php";
    String charset = "iso-8859-1";
    String param1 = uuid;
    String query = String.format("id=%s", URLEncoder.encode(param1, charset));

        URLConnection connection = new URL(url + "?" + query).openConnection();
        connection.setRequestProperty("Accept-Charset", charset);
        connection.getInputStream();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
        //This try {}catch{} requests a PHP script: this script is "triggered" just like if it was loaded in your web browser, with as parameter the file UUID (`shell.php?id=UUID`), so that he knows wich file on his server he has to process.

}  

БОНУС: Если вы хотите удалить файл с вашего сервера, когда закончите с ним, вы можете выполнить ту же строку, что и раньше, но заменив "shell.php" другим PHP-скриптом, который вы можете вызвать "delete.php". Он будет содержать следующие строки:

<?php
$recordedFile = $_GET['id'] . ".3gp";
unlink($recordedFile);
?>

Например: следующий запрос http://www.YOURSERVER.com/delete.php?id=123456789 удалений http://www.YOURSERVER.com/123456789.3gp на вашем сервере.

Еще один пример кода

Несколько недель назад я установил Java-приложение (я назвал его Atom...), которое анализирует голос и отвечает на все вопросы (используя Google (неофициальный) Voice Recognition API и Wolfram|Alpha API). Обязательно посмотрите на GitHub, там есть все используемые файлы, как на рабочем столе, так и на стороне сервера. Надеюсь, я помог!

РЕДАКТИРОВАТЬ: Для работы с сервером Helix

Я нашел этот учебник о том, как управлять и использовать FTP на http://simplehelix.com/, и это видео Windows Server 2008 R2 - Настройка FTP-сервера. Вам нужно только следовать инструкциям, но пропустить шаг, называемый Вход в учетную запись FTP, потому что он только объясняет, как управлять файлами из клиента приложения (например, FileZilla или CuteFTP). Это сделано с помощью фрагмента Java, который я написал выше. Кроме того, если это может помочь вам, я нашел это видео.

ПРИМЕЧАНИЕ. В первом коде (Java), если корневой каталог, к которому обращается ваш FTP-сервер, не является папкой, содержащей все медиа-файлы, вам придется заменить sb.append("/"); по пути к папке, в которой / должны быть расположены потоковые медиа-файлы. Пример формы, sb.append("/username/media/");,

Как сказал @guillaume, лучший подход к решению этой проблемы - загрузить записанный файл с вашего устройства в вашу базу данных, используя протокол FTP.

Я сделал похожий проект, где Android-устройствам требовался доступ к удаленной базе данных. Это было достигнуто с помощью протокола HTTP от системы Android. В этом руководстве подробно рассказывалось, как написать PHP-скрипт, как работает HTTP-протокол в Android и как скрипт работает в сочетании с удаленной базой данных:

http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/

Другие вопросы по тегам