我是服务器端开发的新手。我想处理一个应用程序,我需要通过我的应用程序从我的Android设备上录制Helix Server上的视频。我在Windows Server PC上安装了Helix Server。
在Android应用程序中,我正在尝试在Helix Server上传录制的视频。我已经实现了在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服务器上保存我的视频录制文件? 我应该在服务器端开发上做任何实现吗?
答案 0 :(得分:4)
除非用户具有非常快速的LTE蜂窝连接,否则在给定时间间隔内视频大小与网络上载容量之间的比率为低以同时上载/记录视频流。
但是,录制完成后,您可以通过FTP协议将文件上传到服务器。建议为每个录制的文件Universal Unique Identifier (UUID)
提供能够区分所有其他录制文件的信息。我使用了这段代码(未经Android测试,但在JavaSE 7上运行正常)。由于这是一个相当长(但很快)的过程,我给你做了总结。 (很好,嗯?)
1)生成一个UUID.randomUUID().toString();
的UUID,在整个过程中使用该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.
}
BONUS :如果要在完成后从服务器中删除该文件,可以执行与以前相同的行,但用另一个PHP脚本替换“shell.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(非官方)语音识别API和Wolfram | Alpha API)。你绝对应该take a look at it on GitHub,使用所有文件,桌面端和服务器端。希望我帮助过!
我在How to Manage and Use FTP和此视频simplehelix.com上找到了关于Windows Server 2008 R2 - Configuring an FTP Server的本教程。您只需按照说明操作,但跳过称为登录到FTP帐户的步骤,因为它只解释了如何从应用程序客户端管理文件(如FileZilla或CuteFTP) )。这个 完成了我上面写的Java代码片段。此外,如果它可以帮到你,我找到了this video。
注意:在第一个代码(Java)中,除非您的FTP服务器访问的根目录是包含每个媒体文件的文件夹,否则您必须替换sb.append("/");
通过可流媒体文件所在的文件夹的路径。表单示例sb.append("/username/media/");
。
答案 1 :(得分:0)
正如@guillaume所说,解决此问题的最佳方法是使用FTP协议将录制的文件从您的设备上传到您的数据库。
我做了一个类似的项目,其中Android设备需要访问远程数据库。这是通过使用Android系统的HTTP协议实现的。本教程真正分解并概述了如何编写PHP脚本,HTTP协议如何在android中工作,以及脚本如何与远程数据库结合使用:
http://blog.sptechnolab.com/2011/02/10/android/android-connecting-to-mysql-using-php/