25

サーバーサイド開発初心者です。アプリケーションで作業したいのですが、アプリケーションを介して Android デバイスから Helix Server にビデオを録画する必要があります。Helix Server を Windows Server PC にインストールしました。

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 サーバーに直接保存するにはどうすればよいですか? サーバー側の開発で実装を行う必要がありますか?

4

2 に答える 2

4

ユーザーが非常に高速な LTE セルラー接続を使用していない限り、特定の時間間隔でのビデオのサイズとネットワーク アップロード容量の比率が低すぎて、ビデオ ストリームを同時にアップロード/録画できません。

ただし、記録が完了したら、FTP プロトコルを介してファイルをサーバーにアップロードできます。Universal Unique Identifier (UUID)他のすべての記録ファイルとの違いを確認できるように、各記録ファイルに を与えることをお勧めします。このコードを使用しました (Android ではテストされていませんが、JavaSE 7 では問題なく動作します)。かなり長い (でも短い) プロセスなので、概要を説明します。(いいですね?)

概要

UUID.randomUUID().toString();1)記録されたファイルを識別するためにプロセス全体で使用されるUUID を生成します。
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」を「delete.php」と呼ばれる別の 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 サーバーで作業するには

simplehelix.comで FTPを管理および使用する方法に関するこのチュートリアルと、このビデオWindows Server 2008 R2 - FTP サーバーの構成を見つけました。指示に従うだけで済みますが、FTP アカウントへのログインという手順はスキップしてください。これは、アプリケーション クライアント (FileZilla や CuteFTP など) からファイルを管理する方法のみを説明しているためです。これ、私が上で書いた Java スニペットで行われます。また、お役に立てれば、このビデオを見つけました。

注:最初のコード (Java) では、FTP サーバーがアクセスするルート ディレクトリがすべてのメディア ファイルを含むフォルダーでない限り、ストリーミング可能なメディア ファイルがある/あるべきフォルダーへのパスに置き換える必要がありますsb.append("/");フォーム例、sb.append("/username/media/");.

于 2013-03-06T02:04:33.907 に答える