Подтвердить что ты не робот

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

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

В приложении Android я пытаюсь загрузить записанное видео на сервер Helix. Я выполнил свое приложение для записи видео на SD-карту, но я хотел бы записать и сохранить это видео на сервере Helix напрямую. Я внедрил приложение для 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 напрямую? Должен ли я выполнять какую-либо реализацию на стороне сервера?

4b9b3361

Ответ 1

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

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

Резюме

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

код

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 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 root. Otherwise the PHP скрипт 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 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 скрипт: 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 script, которую вы можете назвать "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 (неофициальный) API распознавания голоса и Wolfram | Alpha API). Вы должны определенно взглянуть на него на GitHub, есть все файлы, используемые как на стороне рабочего, так и на на стороне сервера. Надеюсь, я помог!

EDIT: для работы с сервером Helix

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

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

Ответ 2

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

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

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