Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从我的Android设备直接在Helix服务器上录制视频?_Android_Upload_Video Recording_Helix Server - Fatal编程技术网

如何从我的Android设备直接在Helix服务器上录制视频?

如何从我的Android设备直接在Helix服务器上录制视频?,android,upload,video-recording,helix-server,Android,Upload,Video Recording,Helix Server,我不熟悉服务器端开发。我想在一个应用程序上工作,我需要通过我的应用程序在Helix服务器上从我的Android设备录制视频。我已经在Windows Server PC上安装了Helix服务器 在Android应用程序中,我试图在Helix服务器上上传录制的视频。我已经实现了在SD卡上录制视频的应用程序,但我想直接在Helix服务器上录制并保存该视频。我已经实现了我的Android应用程序,如下所示: public class NewRecordingVideo extends Activity

我不熟悉服务器端开发。我想在一个应用程序上工作,我需要通过我的应用程序在Helix服务器上从我的Android设备录制视频。我已经在Windows Server PC上安装了Helix服务器

在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服务器上?
我是否应该在服务器端开发上进行任何实现?

视频大小与给定时间间隔内的网络上传容量之间的比率很低,无法同时上传/录制视频流,除非用户具有非常快速的LTE蜂窝连接

但是,录制完成后,您可以通过FTP协议将文件上载到服务器。建议为每个记录的文件提供一个
通用唯一标识符(UUID)
,以便能够区分所有其他记录的文件。我使用了这段代码(没有针对Android进行测试,但在JavaSE7上运行良好)。由于这是一个相当长(但很快)的过程,我给你做了一个总结。(很好,嗯?)

总结 1) 使用
UUID.randomUUID().toString()生成UUID将在整个过程中用于识别记录的文件。
2) 记录文件名为“sdcard/”+uuid+“.3gp”

3) 录制结束后,通过FTP上载将文件上载到服务器。
4) 命令您的远程服务器执行PHP脚本,该脚本可以对记录的文件执行任何需要执行的操作,如数据库操作等。(如果有这样的脚本,如果您不需要执行,请跳过此步骤)。
5) 如果需要,请命令远程服务器删除该文件。(通过另一个PHP脚本完成)

代码 奖金:如果您想在处理完文件后从服务器上删除该文件,您可以执行与之前相同的行,但将“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(非官方)语音识别API和Wolfram | Alpha API)。您应该清楚地知道,这里使用了所有的文件,包括桌面端和服务器端。希望我能帮上忙

编辑:使用Helix服务器 我在上找到了这个教程,还有这个视频。您只需按照说明进行操作,但要跳过名为登录FTP帐户的步骤,因为它只说明如何从应用程序客户端(如FileZilla或CuteFTP)管理文件。这是我上面写的Java代码片段的一部分。还有,如果它能帮助你,我发现了


注意:在第一个代码(Java)中,除非FTP服务器访问的根目录是包含所有媒体文件的文件夹,否则您必须替换
sb.append(“/”)可流媒体文件所在文件夹的路径。例如,
sb.append(“/username/media/”)

正如@guillaume所述,解决此问题的最佳方法是使用FTP协议将录制的文件从设备上载到数据库

我做了一个类似的项目,Android设备需要访问远程数据库。这是通过使用android系统的HTTP协议实现的。本教程详细介绍了如何编写PHP脚本、HTTP协议在android中的工作方式以及脚本如何与远程数据库结合使用:


我应该说Atom在github上很酷!而且+1我正在寻找如何使用helix服务器实现它Prasad,我还没有机会使用helix服务器,但关于使用Helix universal server中继广播的讨论讨论讨论了在客户端使用编码器并将其配置为指向Helix服务器:您也可以查看开源Red5媒体服务器,并将移动应用程序作为另一个解决方案:
<?php
$recordedFile = $_GET['id'] . ".3gp";
unlink($recordedFile);
?>