android最简单的录像功能的实现

录像功能的实现:

1.所需要的权限:
  1. <uses-permission android:name="android.permission.CAMERA"/>    <!--摄像头的权限-->
  2.     <uses-permission android:name="android.permission.RECORD_AUDIO"/>    
  3.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>   <>
  4.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
复制代码

2.xml布局的配置:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="fill_parent" >

  5.    
  6.    <SurfaceView 
  7.        android:layout_width="fill_parent"
  8.        android:layout_height="fill_parent"
  9.        android:id="@+id/surfaceView"
  10.        />
  11.     <RelativeLayout
  12.        android:id="@+id/layout"
  13.        android:layout_width="fill_parent"
  14.        android:layout_height="fill_parent"
  15.        android:visibility="gone" >

  16.        <Button
  17.            android:id="@+id/start"
  18.            android:layout_width="wrap_content"
  19.            android:layout_height="wrap_content"
  20.            android:layout_alignParentBottom="true"
  21.            android:layout_alignParentRight="true"
  22.            android:layout_marginRight="17dp"
  23.            android:text="录像" 
  24.            android:onClick="startVoide"
  25.            android:enabled="true"
  26.            />

  27.        <Button
  28.            android:id="@+id/stop"
  29.            android:layout_width="wrap_content"
  30.            android:layout_height="wrap_content"
  31.            android:layout_alignParentBottom="true"
  32.            android:layout_marginRight="14dp"
  33.            android:layout_toLeftOf="@+id/start"
  34.            android:text="停止" 
  35.            android:onClick="startVoide"
  36.             android:enabled="false"
  37.            />

  38.    </RelativeLayout>

  39. </FrameLayout>
复制代码

3.acativity里面的代码:
  1. package com.example.view_player;

  2. import java.io.File;

  3. import android.hardware.Camera;
  4. import android.media.MediaRecorder;
  5. import android.os.Bundle;
  6. import android.os.Environment;
  7. import android.app.Activity;
  8. import android.view.Menu;
  9. import android.view.MotionEvent;
  10. import android.view.SurfaceHolder;
  11. import android.view.SurfaceHolder.Callback;
  12. import android.view.SurfaceView;
  13. import android.view.View;
  14. import android.view.ViewGroup;
  15. import android.view.Window;
  16. import android.view.WindowManager;
  17. import android.widget.Button;
  18. import android.widget.RelativeLayout;

  19. public class MainActivity extends Activity {

  20.         private SurfaceView surfaceView;   //视频显示区域的声明
  21.         private RelativeLayout layout;   //相对布局的声明
  22.         private Callback callback;   //
  23.         private Camera camera;
  24.         private MediaRecorder mediaRecorder;   //媒体录制
  25.         private Button start;   //按钮
  26.         private Button stop;
  27.         
  28.         @Override
  29.         protected void onCreate(Bundle savedInstanceState) {
  30.                 super.onCreate(savedInstanceState);
  31.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  32.                 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
  33.                                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
  34.                 
  35.                 setContentView(R.layout.activity_main);
  36.                 
  37.                 start = (Button) this.findViewById(R.id.start);
  38.                 this.stop = (Button) this.findViewById(R.id.stop);
  39.                 
  40.                 layout = (RelativeLayout) this.findViewById(R.id.layout);
  41.                 surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
  42.                 callback = new MyCallback();
  43.                 surfaceView.getHolder().addCallback(callback);
  44.         }
  45.         
  46.         private class MyCallback implements Callback   //回调类
  47.         {

  48.                 @Override
  49.                 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
  50.                                 int arg3) {
  51.                         // TODO Auto-generated method stub
  52.                         
  53.                 }

  54.                 @Override
  55.                 public void surfaceCreated(SurfaceHolder arg0) {   
  56.                         // TODO Auto-generated method stub
  57.                         try
  58.                         {
  59.                                 camera = Camera.open();    //打开摄像
  60.                                 
  61.                                 camera.setPreviewDisplay(surfaceView.getHolder());
  62.                                 camera.startPreview();  //开始预览
  63.                         }catch(Exception e)
  64.                         {
  65.                                 e.printStackTrace();
  66.                         }
  67.                 }

  68.                 @Override
  69.                 public void surfaceDestroyed(SurfaceHolder arg0) {
  70.                         // TODO Auto-generated method stub
  71.                         if(camera != null)
  72.                         {
  73.                                 camera.stopPreview();   //停止预览
  74.                                 camera.release();      //释放资源
  75.                                 camera = null;
  76.                         }
  77.                 }
  78.                 
  79.         }
  80.         
  81.         public void startVoide(View v)
  82.         {
  83.                 switch(v.getId())
  84.                 {
  85.                 case R.id.start:
  86.                         start.setEnabled(false);
  87.                         stop.setEnabled(true);
  88.                         try
  89.                         {
  90.                                 File file = new File(Environment.getExternalStorageDirectory()
  91.                                                 + "/" + System.currentTimeMillis() + ".3gp");
  92.                                 camera.unlock();
  93.                                 mediaRecorder = new MediaRecorder();    //媒体录制对象
  94.                                 mediaRecorder.setCamera(camera);   //设置摄像
  95.                                 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);   
  96.                                 mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
  97.                                 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  //设置输出的文件的格式
  98.                                 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);   //设置编码
  99.                                 mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
  100.                                 mediaRecorder.setOutputFile(file.getAbsolutePath());   //设置输出文件的路径
  101.                                 mediaRecorder.setVideoSize(320, 240);  //设置video的大小
  102.                                 mediaRecorder.setVideoFrameRate(5);   
  103.                                 mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
  104.                                 mediaRecorder.prepare();   //缓冲
  105.                                 mediaRecorder.start();   //开始录制
  106.                                 
  107.                         }catch (Exception e) {
  108.                                 // TODO: handle exception
  109.                                 e.printStackTrace();
  110.                         }
  111.                         break;
  112.                 case R.id.stop:
  113.                         start.setEnabled(true);
  114.                         stop.setEnabled(false);
  115.                         if(mediaRecorder != null)
  116.                         {
  117.                                 mediaRecorder.stop();   //停止
  118.                                 mediaRecorder.reset();   //重置
  119.                                 mediaRecorder.release();    //释放资源
  120.                                 camera.lock();
  121.                                 mediaRecorder = null;
  122.                         }
  123.                         break;
  124.                 }
  125.         }

  126.         @Override
  127.         public boolean onTouchEvent(MotionEvent event) {
  128.                 // TODO Auto-generated method stub
  129.                 layout.setVisibility(ViewGroup.VISIBLE);   //当触屏的时候按钮可见
  130.                 return super.onTouchEvent(event);
  131.         }
  132. }
复制代码
以下是一个简单的示例代码,用于在Android Opengl录像时添加动态时间水印: ```java private void initGL() { // 创建OpenGL ES context mEGLDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); int[] version = new int[2]; EGL14.eglInitialize(mEGLDisplay, version, 0, version, 1); int[] configAttribs = { EGL14.EGL_SURFACE_TYPE, EGL14.EGL_PBUFFER_BIT, EGL14.EGL_BLUE_SIZE, 8, EGL14.EGL_GREEN_SIZE, 8, EGL14.EGL_RED_SIZE, 8, EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, EGL14.EGL_NONE }; EGLConfig[] configs = new EGLConfig[1]; int[] numConfigs = new int[1]; EGL14.eglChooseConfig(mEGLDisplay, configAttribs, 0, configs, 0, configs.length, numConfigs, 0); int[] pbufferAttribs = { EGL14.EGL_WIDTH, 640, EGL14.EGL_HEIGHT, 480, EGL14.EGL_NONE, }; mEGLSurface = EGL14.eglCreatePbufferSurface(mEGLDisplay, configs[0], pbufferAttribs, 0); int[] contextAttribs = { EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE }; mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], EGL14.EGL_NO_CONTEXT, contextAttribs, 0); EGL14.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext, 0); } private void drawFrame() { // 绘制图像到离屏渲染缓冲区 // ... // 绘制时间水印 GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glUseProgram(mTimeWatermarkProgram); int timeUniform = GLES20.glGetUniformLocation(mTimeWatermarkProgram, "u_Time"); GLES20.glUniform1f(timeUniform, System.currentTimeMillis() / 1000f); int fontUniform = GLES20.glGetUniformLocation(mTimeWatermarkProgram, "u_Font"); GLES20.glUniform1i(fontUniform, mFontTextureUnit); int colorUniform = GLES20.glGetUniformLocation(mTimeWatermarkProgram, "u_Color"); GLES20.glUniform4fv(colorUniform, 1, mColor, 0); // 绘制文字或者位图 // ... // 将渲染好的图像数据保存为视频文件 // ... } ``` 这段代码假设已经有了OpenGL ES 2.0的context,以及渲染图像的代码。在`initGL()`方法中创建离屏渲染缓冲区,以及编译、链接时间水印的GLSL程序。在`drawFrame()`方法中,先渲染图像到离屏渲染缓冲区,然后绘制时间水印,最后将渲染好的图像数据保存为视频文件。需要注意的是,在绘制时间水印之前需要调用`glClear()`方法清空当前帧的内容。同时,需要在GLSL程序中添加时间、字体、颜色等uniform变量,并在Java代码中设置相应的值。 具体的实现细节还需要根据实际需求进行调整,例如绘制文字或者位图的具体实现方式,以及保存视频文件的代码实现方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值