关于android的实时视频录制现在网上炒的很火,我想把自己学习研究的一个视频录制的demo 的心得与大家分享一下
使用的是MediaRecorder 以及使用SurfaceView进行录制的。
视频录制的部分也比较简单,直接看API的图就可以很清楚的知道步骤了。
Android的MediaRecorder包含了Audio和video的记录功能,在Android的界面上,Music和Video两个应用程序都是调用MediaRecorder实现的。
通过操作这个MediaRecorder类就能实现这个音频和视频的录制。
通过几个星期的努力做了一个基本成型的东西。可以录制视频并且可是实时的上传到服务器端。但是没有解决实时的问题,正在研究当中。但是在实时的上传的时候会遇到很多问题。
1.就是在保存本地的路径换成Socket android 的IPA可以支持可以用Socket 来传输
ParcelFileDescriptor pfd = ParcelFileDescriptor
.fromSocket(receiver);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
只要把参数换成Socket 就可以。
但是有个问题,可是实时的传到服务器上。有数据,但是就是不能播放。具体查了好多资料,知道什么原因,但是没有具体的解决方法,目前正在研究方法中。
1.具体不能播放的原因就是,在视频的录制的时候都有个数据回写功能。数据回写就是把视频一些标题数据信息,加载到录制的文件的开头,要是在录制视频没有这个标题头的话就不能播放视频,在本地录制的可以播放,但是用Socket 传输的话就是把那个信息数据加到文件的后面。导致文件开头没有信息无法播放,所以现在正在研究解决方法。
具体实时的上传的代码如下可以参考。
/**
* 实时上传到PC端(边录边传)
*
* @author Administrator 吕俊
*/
private final class ButtonClickListener1 implements View.OnClickListener
{
@Override
public void onClick(View v)
{
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
Toast.makeText(MainActivity.this, R.string.sdcarderror, 1)
.show();
return;
}
try
{
switch (v.getId())
{
case R.id.record:
mediaRecorder.reset();
mediaRecorder
.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 从照相机采集视频
//mediaRecorder
//.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder
.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediaRecorder.setVideoSize(480, 320);
mediaRecorder.setVideoFrameRate(3); // 每秒3帧
mediaRecorder
.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); // 设置视频编码方式
//mediaRecorder
// .setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setPreviewDisplay(surfaceView.getHolder()
.getSurface());
// 实时上传的代码
receiver = new Socket("192.168.1.149", 9999);
ParcelFileDescriptor pfd = ParcelFileDescriptor
.fromSocket(receiver);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mediaRecorder.prepare();// 预期准备
mediaRecorder.start();// 开始刻录
record = true;
break;
case R.id.stop:
if (record)
{
System.out.println(videoFile);
mediaRecorder.stop();
mediaRecorder.release();
receiver.close();
record = false;
}
break;
}
} catch (Exception e)
{
Toast.makeText(MainActivity.this, R.string.error, 1).show();
Log.e(TAG, e.toString());
}
}
}